Как более правильно и точно измерить время выполнения алгоритма на 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;
}