【发布时间】:2016-10-27 02:26:21
【问题描述】:
我已经对这里找到的 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() 的使用?还是我现在正在计算一些随机数。
另外,如果有人知道:这对于使用现代密码加密/解密数据而言是否具有现实价值?我知道这对于该领域来说是主观的并且很难回答,但值得一试......无论哪种情况,我是否正确实施它是我现在最感兴趣的,因为我可以看到我的测试向量通过有了这些结果。
我在关闭 Intel TurboBoost 且仅使用 1 个 CPU 内核的情况下进行测试....我无法关闭超线程(感谢简化的 Lenovo BIOS),但我怀疑它会有所不同,因为我的代码是单线程的.
【问题讨论】:
-
你可能想使用 rdtsc
-
谢谢。我只是从不这样做中吸取了一个惨痛的教训,并且从现在开始会这样做。 __rdtsc 看起来很有用,会试试看!
标签: c performance winapi intrinsics avx2