从 QueryPerformanceCounter() 计算 cycles/byte

Calculating cycles/byte from QueryPerformanceCounter()

我已经对这里找到的 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 调用之间花费的周期(即加密和解密的时间)是 startfinish[=33= 之间的增量],这大约是 7674 个周期。这是4000字节的时间。

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

此外,万一有人知道:对于使用现代密码的 encrypting/decrypting 数据,这通常是一个现实值吗?我知道这在该领域是主观的并且很难回答,但值得一试......无论哪种情况,我现在最想知道的是我是否正确实施它,因为我可以看到我的测试向量通过有了这些结果。

我在关闭 Intel TurboBoost 且只有 1 个 CPU 内核的情况下进行测试....我无法关闭超线程(感谢您简化了 Lenovo BIOS),但我怀疑它会有所不同,因为我的代码是单线程的。

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