从QueryPerformanceCounter()

时间:2016-06-24 12:50:37

标签: c performance winapi intrinsics avx2

我已经对这里找到的PRIMATEs密码进行了一些切片实现:http://primates.ae/(我使用了120位版本)。

我只在C语言中使用了Intel Intrinsics,因此我可以使用AVX2指令集。

由于我做了一个切片实现,我想要优化速度,从而测量性能,我计算每个字节的周期。为此,我使用Windows提供的QueryPerformanceCounter()函数

现在是这样的。在我的计算中,我得到每个字节使用1,91个周期,这似乎 reeeaaally 好。我觉得我必须做错事(我不是一个好的编码员)。我就是这样做的:

//Size of testdata
int testDataSize = 4000; //bytes

//Get CPU frequency (cycles per sec)
LARGE_INTEGER start, finish;
double cpu_frequency;
QueryPerformanceFrequency(&start);
cpu_frequency = (double)(start.QuadPart)

QueryPerformanceCounter(&start);
encrypt(data);
decrypt(data);
QueryPerformanceCounter(&finish);

double cyclesUsed = (double)(finish.QuadPart - start.QuadPart);
double bytesSecond = (cpu_frequency / cyclesUsed) * testDataSize;
double bytesCycle = bytesSecond / cpu_frequency;
double cycles_per_byte = 1 / bytesCycle;

在运行时,两个QueryPerformanceCounter调用之间花费的周期(即加密和解密时间)是 start finish 之间的差值,大约是7674个周期。这是4000字节的时间。

当然,我每个字节只会使用大约1.9个周期,但这看起来非常好......我是否正确实现了周期/字节计算并且我是否理解正确使用QueryPerformanceCounter()?或者我现在正在计算一些随机数。

另外,如果有人知道:这对于使用现代密码加密/解密数据一般来说是否具有现实价值?我知道这对该领域是主观的,很难回答,但值得一试......在任何一种情况下,我是否正确实现它是我现在最感兴趣的,因为我可以看到我的测试向量通过有了这些结果。

我关闭了英特尔TurboBoost测试,只有1个CPU内核....我无法关闭超线程(谢谢简化的联想BIOS),但我怀疑它会有所作为,因为我的代码是单线程的

1 个答案:

答案 0 :(得分:3)

您的代码是正确的,但您误解了数据。 QueryPerformanceFrequency()没有为您提供CPU频率,它会为您提供性能计数器频率。这意味着您在计算任意刻度,而不是周期。使用Windows性能计数器(CPU频率通常是动态的)没有简单的方法来获得循环计数,但是你可以获得相当不错的执行时间。