什么是更快的c ++?数学计算还是作业?

时间:2015-03-27 19:16:52

标签: c++ image-scaling

我有这种代码的和平,我想尽快做到。

我不是一位经验丰富的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
                  )
            ]);
}
  

旁注:我真的认为这是一件好事,我不理解下来的选票。

     

也感谢大家的评论,学到了很多。

3 个答案:

答案 0 :(得分:2)

哪个更快,完全取决于编译器,实际上大多数优化编译器实际上会在编译过程中将你的第二个版本变成你的第一个版本。即使他们不这样做,在现代计算机上,除法操作只需要几纳秒,除非你进行数百万或数十亿次操作,否则在你的应用程序中可能无关紧要。

在所有这种情况下,答案是:

  1. 除非事情比你想要的慢,否则不要担心
  2. 如果某些内容比您想要的要慢,请使用分析器确切地找出导致问题的原因。
  3. 修改

    我只是用这个编译器自己试了一下:

    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输出。所以最基本的编译器优化使这个问题没有实际意义。如果您想尽可能快地使用它,请使用编译器的优化标志并停止担心代码。

答案 1 :(得分:1)

第一个是较慢的,因为您多次进行相同的计算。虽然它可能花费的时间可以忽略不计。您不会注意到任何改进,除非您的代码执行这些操作数千次或实际上更多。除了编译器之外,还可以优化代码来完成它!

使用分析器,有很多免费的。您将获得对操作/功能所用时间的深刻了解。

查看此General C++ Performance Improvement Tips以及许多此类链接,了解有助于提高编码标准的标准做法。

答案 2 :(得分:0)

最低级别,简单分配比乘法或加法更快。

某些处理器具有可在一条指令中执行乘法或加法和赋值的指令。

退回寄存器之间的级别,分配和算术运算比执行内存操作更快。访问缓存通常比片上内存更快。数据来自处理器核心的距离越远,访问速度越慢。芯片外部的存储器访问速度比包含处理器的同一块芯片上的存储器慢。

更快的含义
所以我们知道哪些操作更快。经常被忽视的问题是:

  • 快多少?
  • 获得了多少时间?

让我们采取一个假设的处理器:

  • 作业成本为20纳秒。
  • 增加费用为50纳秒。
  • 乘法费用为100纳秒。

因此,加法运算和赋值之间的“节省”是30纳秒。乘法运算和加法运算之间的节省是50纳秒。请记住,用户无法区分小于1E-2秒的任何内容。那么,需要多少次迭代才能使50纳秒变得明显?

对于现代处理器,必须执行大量迭代,以便从这些指令级别更改中获得大量时间。因此,投资回报(优化这些指令所需的时间)是不值得的。当程序性能影响销售或需求(例如关键系统)时,ROI很高。