在Windows下也有像一些方便的功能,QueryPerformanceCounter从mmsystem.h创建高分辨率定时器.Linux有类似的东西吗?
目前我使用此代码
string now() {
time_t t = time(0);
char buffer[9] = {0};
strftime(buffer, 9, "%H:%M:%S", localtime(&t));
return string(buffer);
}
Run Code Online (Sandbox Code Playgroud)
格式化时间.我需要添加毫秒,因此输出的格式为:16:56:12.321
我编写了一些C代码,在使用MEX编译之后我将其称为MATLAB.在C代码中,我使用以下代码测量计算的一部分时间:
clock_t begin, end;
double time_elapsed;
begin = clock();
/* do stuff... */
end = clock();
time_elapsed = (double) ((double) (end - begin) / (double) CLOCKS_PER_SEC);
Run Code Online (Sandbox Code Playgroud)
经过的时间应该是以秒为单位的执行时间.
然后我将值输出time_elapsed到MATLAB(它被正确导出;我检查过).然后MATLAB端我调用这个C函数(在我使用MEX编译它之后)并使用tic和测量它的执行时间toc.结果是完全荒谬的是我使用tic和toc计算的时间是0.0011s(500次运行时的平均值,st.dev.1.4e-4),而C代码返回的时间是0.037s(平均500次运行,st.dev.00,616).
人们可能会注意到两个非常奇怪的事实:
这些计时器发生了什么事?
我想测量循环中函数的速度.但是为什么我这样做的方式总是打印"0"而不是9位十进制精度(即纳秒/微秒)的高分辨率时序?
这样做的正确方法是什么?
#include <iomanip>
#include <iostream>
#include <time.h>
int main() {
for (int i = 0; i <100; i++) {
std::clock_t startTime = std::clock();
// a very fast function in the middle
cout << "Time: " << setprecision(9) << (clock() - startTime + 0.00)/CLOCKS_PER_SEC << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试测量在OMAP ZOOM 3430 MDK附带的TMS32064x + DSP上执行一段代码所需的时钟周期.我看一下DSP芯片的"程序员指南",它说DSP支持clock()功能.
我做的很简单,我就是这么做的
start = clock();
for (i=0;i<100;i++){
/* do something here */
}
stop = clock();
total = stop - start;
Run Code Online (Sandbox Code Playgroud)
然后将"start","stop"和"total"的值放入以前使用ARM处理器分配的共享内存中.然后我只是将它打印到ARM端的屏幕上.
问题是,在我第一次执行时,我总是得到相同的"总"值,然后在我的下一次运行中我总是得到0!"开始"和"停止"值与"总"值一起出现.
最奇怪的是他们似乎遵循了一点点模式!我把输出结果如下:
# ./sampleapp
Total = 63744
Start clock() value = 0x000000f9
Stop clock() value = 0x0000f9f9
# ./sampleapp
Total = 4177526784
Start clock() value = 0x00f9f9f9
Stop clock() value = 0xf9f9f9f9
# ./sampleapp
Total clock cyles = 0
Start clock() value = 0xf9f9f9f9
Stop clock() value = 0xf9f9f9f9
Run Code Online (Sandbox Code Playgroud)
显然,clock()运行不正常,但我不确定这是因为我做错了什么,还是因为我的硬件不支持这种类型的东西.任何想法为什么会这样?
是否可以在C++中的特定时间调用函数?例如,我想在number_of_elapsed_milliseconds_since_application_start = x时启动函数doIt().
跨平台解决方案将是理想的.
我正在运行一个cpp代码,但有一件事我注意到在Windows 7上,C++代码中的CLOCKS_PER_SEC给出1000而在linux fedora 16上它给出了1000000.有人可以证明这种行为吗?
我正在将C++代码从Linux移植到Windows.在这个过程中,我发现以下行在Windows下(在完全相同的硬件上)慢了大约10倍:
list<char*>* item = new list<char*>[160000];
Run Code Online (Sandbox Code Playgroud)
在Windows上需要大约10毫秒,而在Linux上需要大约1毫秒.请注意,这是平均时间.在Windows上运行此行100次需要约1秒.
这在win32和x64上都会发生,两个版本都在Release中编译,速度通过QueryPerformanceCounter(Windows)和gettimeofday(Linux)来测量.
Linux编译器是gcc.Windows编译器是VS2010.
不知道为什么会发生这种情况?
我有一个CUDA程序在for循环中重复调用内核.该代码通过使用前一个中计算的值来计算矩阵的所有行,直到完成整个矩阵.这基本上是一种动态编程算法.下面的代码与内核并行填充许多单独矩阵的(i,j)条目.
for(i = 1; i <=xdim; i++){
for(j = 1; j <= ydim; j++){
start3time = clock();
assign5<<<BLOCKS, THREADS>>>(Z, i, j, x, y, z)
end3time = clock();
diff = static_cast<double>(end3time-start3time)/(CLOCKS_PER_SEC / 1000);
printf("Time for i=%d j=%d is %f\n", i, j, diff);
}
}
Run Code Online (Sandbox Code Playgroud)
内核assign5很简单
__global__ void assign5(float* Z, int i, int j, int x, int y, int z) {
int id = threadIdx.x + blockIdx.x * blockDim.x;
char ch = database[j + id];
Z[i+id] = (Z[x+id] + Z[y+id] + Z[z+id])*dev_matrix[i][index[ch …Run Code Online (Sandbox Code Playgroud) 我希望能够获得在我的C++程序中执行某些操作所需的纳秒数.
对象创建,函数执行它的时间等等.
在Java,我们做的事情是这样的:
long now = System.currentTimeMillis();
// stuff
long diff = (System.currentTimeMillis() - now);
Run Code Online (Sandbox Code Playgroud)
你会如何在C++中做同样的事情?
我需要计算我的函数经过的时间。现在我正在使用 std::clock 并且据我所知这是测量 CPU 时间,这可能与实时不同。
std::clock_t start;
double duration;
start = std::clock();
someFunctionToMeasure();
duration = (std::clock() - start) / (double)CLOCKS_PER_SEC;
Run Code Online (Sandbox Code Playgroud)
所以我想知道两件事
std::clock 究竟是如何工作的?它只是在计算该功能时测量CPU吗?
有没有更好的方法来测量计算我的函数所用的时间?
我正在尝试使用在用户空间中执行所花费的时间来计算我的C++程序的功能.我从程序内部尝试了clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&start)命令,但我担心这是CPU时间而不是我实际需要的用户时间.时间"程序名称"在这种情况下不起作用,因为我只计时功能.任何帮助都会很棒.谢谢!