- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经对这里找到的 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 调用之间花费的周期(即加密和解密的时间)是开始和完成之间的差值,大约为 7674 个周期。这是4000字节的时间。
自然地,我每个字节只使用大约 1.9 个周期,但这看起来真的很好......我是否正确实现了周期/字节计算并且我是否正确理解了 QueryPerformanceCounter() 的使用?或者我现在正在计算一些随机数。
此外,万一有人知道:这通常是使用现代密码加密/解密数据的现实值(value)吗?我知道这在该领域是主观的并且很难回答,但值得一试......无论哪种情况,我现在最想知道的是我是否正确实现它,因为我可以看到我的测试 vector 通过有了这些结果。
我在关闭 Intel TurboBoost 且只有 1 个 CPU 内核的情况下进行测试......我无法关闭超线程(感谢简化的 Lenovo BIOS),但我怀疑它会有所不同,因为我的代码是单线程的.
最佳答案
您的代码是正确的,但您误解了数据。 QueryPerformanceFrequency()
不会为您提供 CPU 频率,而是为您提供性能计数器频率。这意味着您是根据任意滴答而不是周期来计算的。使用 Windows 性能计数器(CPU 频率通常是动态的)没有简单的方法来获取循环计数,但您可以获得不错的执行时间。
关于从 QueryPerformanceCounter() 计算周期/字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38013877/
在循环遍历每种数据类型(整数、 double 、十进制和变量)的 100 万个随机数后,我试图测试数据类型之间的执行时间差异。我从 Microsoft Developer 网站获取了这段代码。我正在使
嘿,我正在使用 QueryPerformanceCounter 来计算该函数花费的时间(以毫秒为单位),但我收到了这个运行时错误: Run-Time Check Failure #2 - Stack
我正在使用 QueryPerformanceCounter 来测量某些函数/操作的时间。它曾经给我正确的数字,例如,我可以测试 Sleep(1000),它会返回非常接近 1 秒的时间。现在,它返回一个
我想使用 PerformanceCounter 来衡量执行某些操作需要多少时间。 我对 PerformanceCounter 和 C++ 了解不多。我在这里找到了一些代码: How to use Qu
我需要衡量我编写的函数的性能。由于我不能使用 C++11 并且我需要微秒,所以我使用了 windows.h 中的 QueryPerformanceCounter。 #include LARGE_IN
假设从 QueryPerformanceCounter 返回的计数是否安全?与上次系统启动后的时间有关?还是可以在系统运行时重置? MSDN 文章本身并不能保证这一点,但是我看到一些第 3 方信息(例
我正在使用 QueryPerformanceCounter 在我的应用程序中做一些计时。但是,在运行几天后,该应用程序似乎停止正常运行。如果我只是重新启动应用程序,它就会再次开始工作。这让我相信我的计
在 Windows 中通过分辨率较低的计时方法调用 QueryPerformanceCounter 是否会对性能产生影响? 最佳答案 虽然老了,this Dr Dobb's article很好地总结了
我正在考虑在两个同时处于事件状态的线程中重复调用(旋转)QueryPerformanceCounter。我不确定这是否真的是一个问题,因为我没有看到任何关于它的文章,但是 QueryPerforman
我创建了一个简单的程序来确定 QueryPerformanceCounter 调用需要多长时间。在我的计算机上大约需要 8 纳秒,但有时我会看到每次调用出现高达 500 微秒的峰值。 一些细节: Vi
在 linux 中是否有一个等效的 C 函数来读取 CPU 计数器及其频率? 我正在寻找类似于 QueryPerformanceCounter 函数的东西,它可以读取现代 CPU 中的 64 位计数器
嗨,我正在使用 QueryperformanceCounter 对 Delphi 中的一段代码进行计时。由于某种原因,我使用 QueryPerformanceCounter 得到的毫秒数与使用秒表得到
我需要使用 QueryPerformanceCounter Win32 API 格式化日期时间。格式为: HH:mm:ss.ffffff ,包含时分秒和微秒。我需要使用这个函数,因为另一个进程(用 C
#include "TIMER1.h" #include "MAIN.h" typedef unsigned _int64 uint64; void TASK1() { uint64 freq, s
我有一个等待 std::condition_variable 然后循环直到它完成的线程。 我试图滑动我在 opengl 中绘制的矩形。 在不使用 delta 的情况下一切正常,但我希望无论在哪台计算机
我想知道 Windows 函数 GetSystemTimePreciseAsFileTime 是否使用 QueryPerformanceCounter/RDTSC 计数器以亚微秒分辨率检索 UTC 时
我已经对这里找到的 PRIMATEs 密码做了一些切片实现:http://primates.ae/ (我用的是 120 位版本)。 我只用 C 语言制作并使用了 Intel Intrinsics,这样
我在 this post 中找到了有关使用 QueryPerformanceCounter 的有用信息但我面临一个我还没有找到答案的问题。 我正在为 Windows CE 6.0 开发一个应用程序,需
我正在研究在我们的系统中使用 QueryPerformanceCounter 的确切含义,并试图了解它对应用程序的影响。从我的 4 核单 CPU 机器上运行它可以看出,它需要大约 230ns 才能运行
鉴于 C# 中的 Stopwatch 类可以在下面使用类似三个不同计时器的东西,例如 系统定时器精度约为 +-10 ms,具体取决于可以使用 timeBeginPeriod 设置的计时器分辨率它可能约
我是一名优秀的程序员,十分优秀!