Как более правильно и точно измерить время выполнения алгоритма на CPU. На примере Алгоритм k средних

Подскажите правильно ли я использовал библиотеку и функцию clock(), которая возвращает количество тактов процессора, использованной моего кода для измерения время выполнения алгоритма на CPU. Или же есть какой-то другой способ в самой IDE измерить. Буду очень признателен если мне объяснят этот момент

#include <vector>
#include <cmath>
#include <limits>
#include <cstdlib>
#include <ctime>

using namespace std;

struct Point {
    vector<double> attributes;
    int cluster;
};

double euclideanDistance(const vector<double>& a, const vector<double>& b) {
    double sum = 0.0;
    for (size_t i = 0; i < a.size(); ++i) {
        sum += pow(a[i] - b[i], 2);
    }
    return sqrt(sum);
}

void initializeCentroids(vector<Point>& points, vector<vector<double>>& centroids, int k) {
    srand(time(0));
    for (int i = 0; i < k; ++i) {
        centroids[i] = points[rand() % points.size()].attributes;
    }
}

void assignClusters(vector<Point>& points, const vector<vector<double>>& centroids) {
    for (auto& point : points) {
        double minDistance = numeric_limits<double>::max();
        for (size_t i = 0; i < centroids.size(); ++i) {
            double distance = euclideanDistance(point.attributes, centroids[i]);
            if (distance < minDistance) {
                minDistance = distance;
                point.cluster = i;
            }
        }
    }
}

void updateCentroids(vector<Point>& points, vector<vector<double>>& centroids, int k) {
    vector<int> count(k, 0);
    vector<vector<double>> sum(k, vector<double>(points[0].attributes.size(), 0.0));

    for (const auto& point : points) {
        for (size_t i = 0; i < point.attributes.size(); ++i) {
            sum[point.cluster][i] += point.attributes[i];
        }
        count[point.cluster]++;
    }

    for (int i = 0; i < k; ++i) {
        for (size_t j = 0; j < centroids[i].size(); ++j) {
            centroids[i][j] = sum[i][j] / count[i];
        }
    }
}

int main() {
    system("chcp 1251");
    int k = 5;
    int numPoints = 130000;
    int numAttributes = 4;

    vector<Point> points(numPoints, Point{ vector<double>(numAttributes), -1 });
    vector<vector<double>> centroids(k, vector<double>(numAttributes));

    // Инициализация данных (здесь можно загрузить данные из файла или сгенерировать случайные)
    for (auto& point : points) {
        for (auto& attribute : point.attributes) {
            attribute = static_cast<double>(rand()) / RAND_MAX;
        }
    }

    initializeCentroids(points, centroids, k);

    clock_t start = clock();

    bool changed;
    do {
        changed = false;
        assignClusters(points, centroids);
        vector<vector<double>> oldCentroids = centroids;
        updateCentroids(points, centroids, k);

        for (size_t i = 0; i < centroids.size(); ++i) {
            if (euclideanDistance(oldCentroids[i], centroids[i]) > 1e-4) {
                changed = true;
                break;
            }
        }
    } while (changed);

    clock_t end = clock();
    double duration = double(end - start) / CLOCKS_PER_SEC;

    cout << "Кластеризация завершена." << endl;
    cout << "Время выполнения: " << duration << " секунд." << endl;

    return 0;
}

Ответы (0 шт):