分配函数值和不分配变量之间的速度差异
Speed difference between assign function value and not assign to a variable
所以这对我来说真的是个谜。我在测量我自己的正弦函数的时间并将它与标准的sin()进行比较。但有一种奇怪的行为。当我使用函数只是独立的,如:
sin(something);
我得到的平均时间像(在10轮中测量1000000个调用)3.1276 ms对于标准正弦函数和51.5589 ms对于我的实现。但是当我使用这样的代码时:
float result = sin(something);
我突然得到76.5621 ms对于标准sin()和49.3675 ms对于我的。我知道给变量赋值需要一些时间但为什么不把时间也加到正弦函数上呢?当标准值快速增长时,它基本不变。
编辑:我的测量代码:
ofstream file("result.txt",ios::trunc);
file << "Measured " << repeat << " rounds with " << callNum << " calls in each n";
for (int i=0;i<repeat;i++)
{
auto start = chrono::steady_clock::now();
//call the function here dattebayo!
for (int o=0; o<callNum;o++)
{
double g = sin((double)o);
}
auto end = chrono::steady_clock::now();
auto difTime = end-start;
double timeD = chrono::duration <double,milli> (difTime).count();
file << i << ": " << timeD << " msn";
sum += timeD;
}
在任何现代编译器中,编译器将知道sin
, cos
, printf("%sn", str)
等函数,并将其转换为更简单的形式[如果值为常数则为常数,printf("%sn", str);
变为puts(str);
]或完全删除[如果知道函数本身没有"副作用",换句话说,它只是计算返回值,并且在其他方面对系统没有影响]。
即使在编译器处于低优化模式甚至没有优化模式时,这种情况也经常发生在标准函数中。
你需要确保你的函数的结果是真正用于在优化模式下调用它。将返回值一起添加到循环中…
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么在读取文件大小时文件IO速度会发生变化
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 此分配对速度有影响吗?
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- 创建内/外循环对象:分配和速度
- 分配std::vector数组会减慢后续计算的速度
- 为什么在进行隐式转换时分配速度较慢?
- 分配大小是否会影响其速度
- 分配约10GB的矢量-如何加快速度
- 分配函数值和不分配变量之间的速度差异
- 删除std::lock_guard相对于其他堆栈分配对象的顺序/速度