如何测量每秒增量的数量
How to measure the number of increments per second
我想测量我的PC可以增加计数器N
次的速度(例如,对于N = 10^9
(。
我尝试了以下代码:
using namespace std
auto start = chrono::steady_clock::now();
for (int i = 0; i < N; ++i)
{
}
auto end = chrono::steady_clock::now();
但是,编译器足够聪明,可以简单地设置i = n,而我得到的start==end
不管n。
如何更改代码来测量增量速度?(在循环中添加昂贵的操作将主导运行时,并且不允许测量正确(。
。我使用Windows 10和Visual Studio 15.9.7。
有些动机:我的代码大约需要2秒钟的n = 10^9。我想知道是否还有任何"肉"进一步优化它(例如,它可能会降低到1秒?还是循环本身需要更多?(
这个问题在C或C 中确实没有意义。编译器旨在生成满足源代码定义的约束的最快代码。在您的问题中,您没有定义编译器必须完全循环的约束。因为循环没有效果,所以优化器将删除它。
Gabriel Staple的答案可能是您可以找到问题的最接近的问题,但这也不是正确的,因为它定义了太多的约束,以限制编译器实现最佳代码的自由。每次修改变量时,挥发性通常会迫使编译器将结果写回内存。
例如,此代码:
void foo(int N) {
for (volatile int i = 0; i < N; ++i)
{
}
}
成为此组件(在我尝试过的X64编译器上(:
mov DWORD PTR [rsp-4], 0
mov eax, DWORD PTR [rsp-4]
cmp edi, eax
jle .L1
.L3:
mov eax, DWORD PTR [rsp-4] # Read i from mem
add eax, 1 # i++
mov DWORD PTR [rsp-4], eax # Write i to mem
mov eax, DWORD PTR [rsp-4] # Read it back again before
# evaluating the loop condition.
cmp eax, edi # Is i < N?
jl .L3 # Jump back to L3 if not.
.L1:
听起来您的真实问题更像是多快:
L1: add eax, 1
jmp L1
甚至答案很复杂,需要了解CPU管道的内部。
我建议与Godbolt一起玩,以更多地了解编译器正在做什么。例如https://godbolt.org/z/59xusu
您可以直接测量"空环"的速度,但是说服C 编译器发射它并不容易。GCC和Clang可以用asm volatile("")
欺骗,但是MSVC内联装配始终是不同的,并且完全被64位程序禁用。
可以使用MASM侧步,限制:
.MODEL FLAT
.CODE
_testfun PROC
sub ecx, 1
jnz _testfun
ret
_testfun ENDP
END
使用extern "C" void testfun(unsigned N);
导入您的代码。
在您的循环中尝试volatile int i = 0
。volatile
关键字告诉编译器,由于外部事件或线程,该变量可能随时更改,因此它无法对将来的变量进行相同的假设。
- 在C++中测量postscript字体宽度
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 用时钟测量程序的运行时间
- 用于测量微秒的QueryPerformanceCounter的奇怪行为
- 为什么根据测量位置测量经过的时间时会有很大的不同?
- 为什么我的程序在输入某个形状的面积的测量值后没有结束?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 分别测量每个线程上花费的 CPU 时间(C++)
- 如何测量管道延迟?
- 测量时间以在 c++ 中生成更好的随机数
- OpenCL 内核计时测量 0 秒或导致 SIGABRT
- 给定使用 C++ 或 C,我如何测量在 linux 下进行线程切换需要多长时间?可能吗?
- 使用 Qt 测量过程的实际运行时间
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- V8垃圾收集器回调,用于测量GC活动
- 测量精确的时间,单位为纳秒C++
- 如何测量cudaMalloc执行时间
- C/C++memcpu基准测试:测量CPU和墙时间
- 如何测量一个音频样本中的低音量
- 如何访问CGAL三维三角测量中的面