c ++中什么更快?数学计算还是作业?
What is faster in c++? Math calculations or assignment?
我有这个和平的代码,我想尽快完成它。
我不是经验丰富的 c++ 开发人员,所以我很想知道你们是否想出了一些非常好的该算法的重新实现,因为我删除了所有的作业,认为这是一件好事...
现在我真的不知道那是否是最好的选择。
那么,什么更快?
for(register uint pPos = 0; pPos < size; pPos++) {
img->setPixel(pPos % dst_w, pPos / dst_w,
buffer32[
sf * (
(pPos / dst_w * src_w) +
(pPos % dst_w)
)
]);
}
或
for(register uint pPos = 0, x = 0, y = 0; pPos < size; pPos++) {
x = pPos % dst_w;
y = pPos / dst_w;
img->setPixel(x, y,
buffer32[
sf * (
(y * src_w) + x
)
]);
}
Side note: I really thought it was a good thing to ask, I don't understand the down votes.
Also thank you all for the comments, learned a lot.
哪个更快完全取决于编译器,事实上大多数优化编译器都会在编译期间将您的第二个版本转换为第一个版本。即使他们不这样做,在现代计算机上,一个除法运算也只需要几纳秒,所以除非你做这个运算数百万或数十亿次,否则它在你的应用程序中可能并不重要。
在所有类似情况下,答案是:
- 别担心,除非有什么东西比你想要的慢
- 如果速度比您希望的慢,请使用分析器找出导致问题的确切原因。
编辑
我自己用这个编译器试了一下:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
使用此编译器,您的代码将编译为与 g++ -S -O1
完全相同的 ASM 输出。因此,最基本的编译器优化使这个问题没有实际意义。如果您想使其尽可能快,请使用编译器的优化标志并停止担心代码。
第一个较慢,因为您要多次执行相同的计算。虽然它可能需要的时间可以忽略不计。您不会注意到任何改进,除非您的代码执行这些操作数千次或实际上更多次。无论如何,您的编译器可以优化代码来执行此操作!
使用分析器,那里有很多免费的分析器。您将对 operations/functions 花费的时间有一个很好的了解。
查看此 General C++ Performance Improvement Tips 和许多此类链接,了解可帮助您提高编码标准的标准做法。
最低级别的简单赋值比乘法或加法更快。
有些处理器的指令可以在一条指令中执行乘法或加法和赋值操作。
后退一级,寄存器之间的赋值和算术运算比用内存执行运算更快。访问缓存通常比片上内存更快。数据离处理器核心越远,访问越慢。访问芯片外的内存要比访问包含处理器的同一块硅片上的内存慢。
更快的含义
所以我们知道哪些操作更快。经常被忽视的问题是:
- 快多少?
- 获得了多少时间?
让我们假设一个处理器:
- 分配花费 20 纳秒。
- 添加花费 50 纳秒。
- 乘法运算耗时 100 纳秒。
所以加法运算和赋值之间的 "savings" 是 30 纳秒。乘法运算和加法运算之间节省了 50 纳秒。请记住,用户无法区分小于 1E-2 秒的任何内容。那么,需要多少次迭代才能让 50 纳秒引人注目?
对于现代处理器,必须执行大量迭代才能从这些指令级别更改之一中获得大量时间。所以 return 上的投资(优化这些指令所花费的时间)是不值得的。只有当程序性能影响销售或需求(例如关键系统)时,投资回报率才会高。
我有这个和平的代码,我想尽快完成它。
我不是经验丰富的 c++ 开发人员,所以我很想知道你们是否想出了一些非常好的该算法的重新实现,因为我删除了所有的作业,认为这是一件好事...
现在我真的不知道那是否是最好的选择。
那么,什么更快?
for(register uint pPos = 0; pPos < size; pPos++) {
img->setPixel(pPos % dst_w, pPos / dst_w,
buffer32[
sf * (
(pPos / dst_w * src_w) +
(pPos % dst_w)
)
]);
}
或
for(register uint pPos = 0, x = 0, y = 0; pPos < size; pPos++) {
x = pPos % dst_w;
y = pPos / dst_w;
img->setPixel(x, y,
buffer32[
sf * (
(y * src_w) + x
)
]);
}
Side note: I really thought it was a good thing to ask, I don't understand the down votes.
Also thank you all for the comments, learned a lot.
哪个更快完全取决于编译器,事实上大多数优化编译器都会在编译期间将您的第二个版本转换为第一个版本。即使他们不这样做,在现代计算机上,一个除法运算也只需要几纳秒,所以除非你做这个运算数百万或数十亿次,否则它在你的应用程序中可能并不重要。
在所有类似情况下,答案是:
- 别担心,除非有什么东西比你想要的慢
- 如果速度比您希望的慢,请使用分析器找出导致问题的确切原因。
编辑
我自己用这个编译器试了一下:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
使用此编译器,您的代码将编译为与 g++ -S -O1
完全相同的 ASM 输出。因此,最基本的编译器优化使这个问题没有实际意义。如果您想使其尽可能快,请使用编译器的优化标志并停止担心代码。
第一个较慢,因为您要多次执行相同的计算。虽然它可能需要的时间可以忽略不计。您不会注意到任何改进,除非您的代码执行这些操作数千次或实际上更多次。无论如何,您的编译器可以优化代码来执行此操作!
使用分析器,那里有很多免费的分析器。您将对 operations/functions 花费的时间有一个很好的了解。
查看此 General C++ Performance Improvement Tips 和许多此类链接,了解可帮助您提高编码标准的标准做法。
最低级别的简单赋值比乘法或加法更快。
有些处理器的指令可以在一条指令中执行乘法或加法和赋值操作。
后退一级,寄存器之间的赋值和算术运算比用内存执行运算更快。访问缓存通常比片上内存更快。数据离处理器核心越远,访问越慢。访问芯片外的内存要比访问包含处理器的同一块硅片上的内存慢。
更快的含义
所以我们知道哪些操作更快。经常被忽视的问题是:
- 快多少?
- 获得了多少时间?
让我们假设一个处理器:
- 分配花费 20 纳秒。
- 添加花费 50 纳秒。
- 乘法运算耗时 100 纳秒。
所以加法运算和赋值之间的 "savings" 是 30 纳秒。乘法运算和加法运算之间节省了 50 纳秒。请记住,用户无法区分小于 1E-2 秒的任何内容。那么,需要多少次迭代才能让 50 纳秒引人注目?
对于现代处理器,必须执行大量迭代才能从这些指令级别更改之一中获得大量时间。所以 return 上的投资(优化这些指令所花费的时间)是不值得的。只有当程序性能影响销售或需求(例如关键系统)时,投资回报率才会高。