C++ 从性能角度看,什么更快?
从性能的角度来看,哪种顺序实现更快(我确实意识到,第二种实现需要更多的内存和时间将值写入RAM):C++ 从性能角度看,什么更快?,c++,performance,gcc,compiler-optimization,C++,Performance,Gcc,Compiler Optimization,从性能的角度来看,哪种顺序实现更快(我确实意识到,第二种实现需要更多的内存和时间将值写入RAM): for(int j=3;j我认为这取决于。如果编译器能够证明我在循环常量传播的执行过程中没有改变,则可以删除对sqrt()和ceil()的重复求值。如果编译器不能确保我在执行过程中是常量,那么它别无选择,只能求值ceil(sqrt())在第一个示例中,我一次又一次地进行了测量,并使用了底部的代码(也可以随意使用) VC2013(英特尔core i3 1.80GHz)的结果: GCC v4.7
for(int j=3;j我认为这取决于。如果编译器能够证明我在循环常量传播的执行过程中没有改变,则可以删除对sqrt()和ceil()的重复求值。如果编译器不能确保我在执行过程中是常量,那么它别无选择,只能求值ceil(sqrt())在第一个示例中,我一次又一次地进行了测量,并使用了底部的代码(也可以随意使用)
- VC2013(英特尔core i3 1.80GHz)的结果:
- GCC v4.7.2中的结果(无特征):
似乎第二种方法的性能略优于第一种方法(我认为这是预期的结果)。但是,速度并不会慢几个数量级。在我看来,差异非常小,可以得出一个安全的结论。显然,编译器优化和系统架构起着重要作用
#include <iostream>
#include <cmath>
#include <chrono>
// facility to measure time
template<typename TimeT = std::chrono::milliseconds>
struct ExecTime
{
template<typename F>
static typename TimeT::rep exec(F const &func)
{
auto start = std::chrono::system_clock::now();
func();
auto duration = std::chrono::duration_cast< TimeT>(
std::chrono::system_clock::now() - start);
return duration.count();
}
};
// dummy function to call in loop
void dummy() { int a = 0; }
int main()
{
int const iters = 30;
double d = 999999999999.0;
auto fun1 = [&]() {for (int j = 3; j <= ceil(sqrt(d)); j++) dummy();};
auto fun2 = [&]() {int max = ceil(sqrt(d)); for (int j = 3; j <= max; j++) dummy(); };
double time1 = 0.0;
for(int i = 0; i < iters; ++i) {
time1 += ExecTime<>::exec(fun1);
}
double time2 = 0.0;
for (int i = 0; i < iters; ++i) {
time2 += ExecTime<>::exec(fun1);
}
std::cout << "TIME FUN1 = " << time1 / static_cast<double>(iters) << " milli-seconds" << std::endl;
std::cout << "TIME FUN2 = " << time2 / static_cast<double>(iters) << " milli-seconds" << std::endl;
return(0);
}
#包括
#包括
#包括
//测量时间的设施
样板
结构执行时间
{
样板
静态typename TimeT::rep exec(F const&func)
{
自动启动=标准::时钟::系统时钟::现在();
func();
自动持续时间=标准时间:持续时间(
std::chrono::system_clock::now()-start);
返回duration.count();
}
};
//要在循环中调用的伪函数
void dummy(){int a=0;}
int main()
{
整数常数=30;
双d=99999999.0;
auto fun1=[&](){for(int j=3;j)“欢迎提供任何关于在何处查找答案的提示。”-在计算机上运行它们并计时?从语言纯度的角度出发,使用“观点”或“观点”更可取。两个变体都运行一百万次,然后计时。或者查看并比较两个备选方案生成的代码。很可能编译器会将第一个变体优化为第二个变体。为了清晰起见,我更喜欢第二个变体。速度无关紧要,因为我看不出几纳秒会对整个过程产生更大的影响应用程序的所有操作时间。您是否分析了应用程序以确保这是性能瓶颈?如果您想查看gcc代码,请参阅“循环优化”这里-在编译器将调用移出循环之前,不需要排除这些函数可能产生的任何副作用吗?@Bgie:大多数值得称道的优化编译器都具有潜在性能关键的标准C库函数的内置知识。但是,你是对的,编译器必须证明没有r相关副作用。请参阅更新的问题。
int max=ceil(sqrt(i));
for(int j=3; j<=max;j++){
...
}
TIME FUN1 = 73.8 milli-seconds
TIME FUN2 = 72.2 milli-seconds
TIME FUN1 = 23.7 milli-seconds
TIME FUN2 = 23.5 milli-seconds
#include <iostream>
#include <cmath>
#include <chrono>
// facility to measure time
template<typename TimeT = std::chrono::milliseconds>
struct ExecTime
{
template<typename F>
static typename TimeT::rep exec(F const &func)
{
auto start = std::chrono::system_clock::now();
func();
auto duration = std::chrono::duration_cast< TimeT>(
std::chrono::system_clock::now() - start);
return duration.count();
}
};
// dummy function to call in loop
void dummy() { int a = 0; }
int main()
{
int const iters = 30;
double d = 999999999999.0;
auto fun1 = [&]() {for (int j = 3; j <= ceil(sqrt(d)); j++) dummy();};
auto fun2 = [&]() {int max = ceil(sqrt(d)); for (int j = 3; j <= max; j++) dummy(); };
double time1 = 0.0;
for(int i = 0; i < iters; ++i) {
time1 += ExecTime<>::exec(fun1);
}
double time2 = 0.0;
for (int i = 0; i < iters; ++i) {
time2 += ExecTime<>::exec(fun1);
}
std::cout << "TIME FUN1 = " << time1 / static_cast<double>(iters) << " milli-seconds" << std::endl;
std::cout << "TIME FUN2 = " << time2 / static_cast<double>(iters) << " milli-seconds" << std::endl;
return(0);
}