我确定这看起来像是一个微不足道的问题,但我遇到了" 时钟()"功能在我的程序中(请注意我已经检查过类似的问题,但它们似乎并没有在相同的上下文中关联)。我的时钟输出几乎总是0,但似乎也有几个10(这就是我感到困惑的原因)。我考虑过这样一个事实:函数调用可能过快处理但是通过排序算法判断,肯定应该花一些时间。
提前感谢大家的帮忙! :)
PS我真的很抱歉关于功能之间变量关联的混乱(它将组合代码I合并在一起,并且在美化之前我正确关注正确的输出) :d
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int bruteForce(int array[], const int& sizeofArray);
int maxSubArray (int array[], int arraySize);
int kadane_Algorithm(int array[], int User_size);
int main()
{
int maxBF, maxDC, maxKD;
clock_t t1, t2, t3;
int arraySize1 = 1;
double t1InMSEC, t2InMSEC, t3InMSEC;
while (arraySize1 <= 30000)
{
int* array = new int [arraySize1];
for (int i = 0; i < arraySize1; i++)
{
array[i] = rand()% 100 + (-50);
}
t1 = clock();
maxBF = bruteForce(array, arraySize1);
t1 = clock() - t1;
t1InMSEC = (static_cast <double>(t1))/CLOCKS_PER_SEC * 1000.00;
t2 = clock();
maxDC = maxSubArray(array, arraySize1);
t2 = clock() - t2;
t2InMSEC = (static_cast <double>(t2))/CLOCKS_PER_SEC * 1000.00;
t3 = clock();
maxKD = kadane_Algorithm(array, arraySize1);
t3 = clock() - t3;
t3InMSEC = (static_cast <double>(t3))/CLOCKS_PER_SEC * 1000.00;
cout << arraySize1 << '\t' << t1InMSEC << '\t' << t2InMSEC << '\t' << t3InMSEC << '\t' << endl;
arraySize1 = arraySize1 + 100;
delete [] array;
}
return 0;
}
int bruteForce(int array[], const int& sizeofArray)
{
int maxSumOfArray = 0;
int runningSum = 0;
int subArrayIndex = sizeofArray;
while(subArrayIndex >= 0)
{
runningSum += array[subArrayIndex];
if (runningSum >= maxSumOfArray)
{
maxSumOfArray = runningSum;
}
subArrayIndex--;
}
return maxSumOfArray;
}
int maxSubArray (int array[], int arraySize)
{
int leftSubArray = 0;
int rightSubArray = 0;
int leftSubArraySum = -50;
int rightSubArraySum = -50;
int sum = 0;
if (arraySize == 1) return array[0];
else
{
int midPosition = arraySize/2;
leftSubArray = maxSubArray(array, midPosition);
rightSubArray = maxSubArray(array, (arraySize - midPosition));
for (int j = midPosition; j < arraySize; j++)
{
sum = sum + array[j];
if (sum > rightSubArraySum)
rightSubArraySum = sum;
}
sum = 0;
for (int k = (midPosition - 1); k >= 0; k--)
{
sum = sum + array[k];
if (sum > leftSubArraySum)
leftSubArraySum = sum;
}
}
int maxSubArraySum = 0;
if (leftSubArraySum > rightSubArraySum)
{
maxSubArraySum = leftSubArraySum;
}
else maxSubArraySum = rightSubArraySum;
return max(maxSubArraySum, (leftSubArraySum + rightSubArraySum));
}
int kadane_Algorithm(int array[], int User_size)
{
int maxsofar=0, maxending=0, i;
for (i=0; i < User_size; i++)
{
maxending += array[i];
if (maxending < 0)
{
maxending = 0 ;
}
if (maxsofar < maxending)
{
maxsofar = maxending;
}
}
return maxending;
}
输出如下:(仅使用片段进行可视化)
答案 0 :(得分:4)
您的问题可能是clock()
没有足够的分辨率:您真正 在所允许的精度内零时间。如果没有,那么几乎可以肯定的是,编译器正在优化计算,因为它正在计算未被使用的东西。
默认情况下,您确实应该使用chrono
标头而不是过时的C设施进行计时。特别是high_resolution_clock
,如果你发现自己确实需要这种东西,那么它往往适合测量相对较快的东西。
准确地对事物进行基准测试是一项非常重要的练习,你真的应该阅读如何正确地做到这一点。有许多问题涉及缓存或令人惊讶的编译器优化或可变CPU频率等问题,许多程序员以前从未想过这些问题,忽略它们会导致错误的结论。
一个特别的方面是你通常应该安排实际需要一些时间的事情;例如运行你正在测试数千个不同输入的任何东西,以便持续时间例如是整整一秒或更长的数量级。这有助于提高基准测试的精度和准确性。