我在两台具有不同架构的不同机器上运行以下程序。我们组织的做法是在纽约机器上构建可执行文件并将其复制到新加坡机器上。
以下是纽约和新加坡机器的架构。
纽约: SunOS pns15a-5203a 5.10 Generic_137111-04 sun4u sparc SUNW,Sun-Fire-V440
新加坡: SunOS sgs75a-5201b 5.10 Generic_137111-04 sun4v sparc SUNW,SPARC-Enterprise-T5220
#include <cstdio>
#include <sys/time.h>
#include <cstdlib>
#include <unistd.h>
#include <cstring>
using namespace std;
int main (int argc, char **argv)
{
char **p;
int num_allocations = atoi(argv[1]);
clock_t start = clock();
p = new char* [num_allocations];
clock_t end1 = clock();
for (int ii=0; ii< num_allocations; ii++)
{
p[ii] = new char [num_allocations];
memset (p[ii], sizeof(char)*num_allocations, '\0');
}
clock_t end2 = clock();
for (int ii=0; ii< num_allocations; ii++)
{
delete[] p[ii];
}
delete[] p;
printf("Time Taken for allocations(%d) = %lf seconds for initialization %.2f seconds \n", num_allocations, (double)(end1 - start)/CLOCKS_PER_SEC, (double)(end2 - end1)/CLOCKS_PER_SEC);
}
我正在运行不同字符大小的程序。
./ run_test.csh
#!/bin/csh -f -x
./a.out 1
./a.out 1024
./a.out 2048
./a.out 4096
./a.out 8192
./a.out 16384
Newyork和新加坡机器的输出如下:
纽约机器
分配时间(1)= 0.000000秒,用于初始化0.00秒
分配时间(1024)= 0.000000秒,用于初始化0.00秒
分配时间(2048)= 0.000000秒,初始化0.01秒
分配时间(4096)= 0.000000秒,初始化0.03秒
分配时间(8192)= 0.000000秒,初始化0.11秒
分配时间(16384)= 0.000000秒,初始化0.37秒
新加坡机器的时间:
分配时间(1)= 0.000000秒,用于初始化0.00秒
分配时间(1024)= 0.000000秒,用于初始化0.00秒
分配时间(2048)= 0.000000秒,初始化0.02秒
分配时间(4096)= 0.000000秒,初始化0.05秒
分配时间(8192)= 0.000000秒,初始化0.18秒
分配时间(16384)= 0.000000秒,初始化0.53秒
如何开始调查此问题?
答案 0 :(得分:4)
对功能进行基准测试时,非常重要的是执行操作非常多次,然后将总时间除以运行次数。否则,您的计时结果将太嘈杂而无意义。此外,如果其他人正在使用该计算机,则计时可能会受到该计算机上其他作业的影响。如果您的目标是仅对相关特定功能进行基准测试(并且您在与机器上的其他用户竞争资源时不一定试图了解性能),那么在几次重复运行(这也让你了解缓存预热后的速度)。
如果你真的只运行你看起来已经运行过的东西,那听起来你的结果太吵了,什么都没说。作为第一步,我建议将主函数的内容包装在循环中,并重复N次,然后在最后将总时间除以N.另外,您确定要测量时钟周期数,而不是测量墙时间(通过gettimeofday测量)吗?
假设您正在遵循测量时序的合理程序,如果您注意到时间与增加的大小不同,其中算法没有改变,这可能是不同高速缓存大小(例如L1和L2高速缓存或不同数量)的结果RAM)。如果一台机器的缓存比另一台机器大,那么你会发现具有较小缓存的机器在它开始获得缓存未命中时的时间明显变慢,而一切机器仍然适合另一台机器的缓存。作为起点,我会看一下这些机器规格。