- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我需要在我的一些代码中使用对数函数,但底数无关紧要。所以我开始在 log()
、log2()
和 log10()
之间按性能进行选择,前提是我发现任何显着差异。 (我将这些函数分别称为 ln
、lb
和 lg
)。
我为什么要对此大惊小怪?因为我将在优化算法的每次迭代中调用该函数多达 400,000,000 次。这既不是可选的,也不是我的问题的主题。
我设置了一些非常基本的测试,如下所示:
timespec start, end;
double sum = 0, m;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
for (int n = 1; n < INT_MAX; ++n)
{
m = n * 10.1;
sum += log(m);
}
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
cout << "ln=";
cout << diff(start, end).tv_sec << ":" << diff(start, end).tv_nsec << endl;
... // likewise for log2 and log10
(timespec diff(timespec start, timespec end) 如果你愿意的话....)
得到以下结果:
GCC v4.6.3
-O0
ln=140:516853107
lb=155:878100147
lg=173:534086352
-O1
ln=133:948317112
lb=144:78885393
lg=163:870021712
-O2
ln=9:108117039
lb=9:134447209
lg=4:87951676
-O3
ln=9:102016996
lb=9:204672042
lg=4:153153558
我查看了使用 -S
编译的输出,但我对汇编程序的掌握还不够好,无法完全理解其中的差异。 -S
输出:-O0 -S , -O3 -S
为什么 lg
使用 O2/O3 优化得更好?
编辑:Source code ,请注意第三个循环中的错字,这是 log10 看起来更快的原因(mult. 得到优化)。我已经接受了我认为最接近的答案,因为问题现已结束,尽管我从 drhirsch 和 janneb 的答案中学到了很多东西。
最佳答案
这将取决于 C 库中 log() 函数的实现、编译器版本、硬件架构等。无论如何,下面我在 x86-64 上使用 GCC 4.4 和 glibc 2.11。
更改示例以便我添加一行
cout << "sum=" << sum << endl;
这会阻止编译器优化 log() 调用,正如我在评论中提到的,我得到以下时间(仅整秒,-O2):
这些时间似乎与原帖中的 -O0 和 -O1 时间大致一致;在更高的优化级别,日志评估被优化掉,因此 -O2 和 -O3 的结果是如此不同。
此外,使用“perf”分析器查看日志示例,报告中排名前 5 的违规者是
# Samples: 3259205
#
# Overhead Command Shared Object Symbol
# ........ .............. ......................... ......
#
87.96% log /lib/libm-2.11.1.so [.] __ieee754_log
5.51% log /lib/libm-2.11.1.so [.] __log
2.88% log ./log [.] main
2.84% log /lib/libm-2.11.1.so [.] __isnan
0.69% log ./log [.] log@plt
除了 main 之外,所有其他符号都与 log() 调用有关。总结这些,我们可以得出结论,这个示例的总运行时间的 97% 都花在了 log() 中。
__ieee754_log的实现见here in the glibc git repo .相应地,其他实现是:log2 , log10 .请注意,之前的链接指向 HEAD 版本,对于已发布的版本,请参阅其相应的分支
关于c++ - 解释需要 : log10 faster than log and log2, 但仅限于 O2 和更大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10810105/
Strassen 的算法在多项式上比 n 次方正则矩阵乘法快。 “多项式更快”是什么意思? 最佳答案 您的问题与“复杂性”的理论概念有关。例如,据说正则矩阵乘法的复杂度为 O(n^3)。这意味着随着维
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
假设我有两个 PHP 语句: echo "foo"."bar" echo "foo", "bar" 注意连接字符串的不同方式 - 使用 . 或 ,. 我意识到这两种方法之间的实际区别,使用 , 为关键
我有一个 RGB 图像,并尝试将 RGB 上的每个像素设置为黑色,其中相应的 alpha 像素也为黑色。所以基本上我试图将 Alpha“烘焙”到我的 RGB 中。我已经尝试使用 PIL 像素访问对象、
可能这个问题以前已经以许多不同的方式回答过很多次了。然而,我一直在寻找更具体的东西。通用词典,我相信比哈希表更快,因为它们不需要经历装箱/拆箱的过程。 但是,哈希表不是经过排序的,这意味着搜索可以更快
以这种方式加入给定的选择会更快吗 select ... join table1 on condition1 join table2 on condition2 然后这个 select ... join
我观看了演讲并阅读了博客文章,但我仍然不确定...这是为什么 template struct conditional { template using f = T; }; template<> str
我想知道用离散数据集编码的二维图形。对我来说,似乎由于计算机以离散集合运行,所以对图形做同样的事情也许更有意义。 例如,与其让一条线由两个 vector 表示,让计算机整理出像素配置,然后必须用代数方
我正在开发一个将大量数据写入磁盘的 C++ 程序。以下函数对数据进行 gzip 压缩并将其写入文件。压缩数据约为100GB。压缩并写出数据的函数如下: void constructSNVFastqD
我最近遇到了这段SQL: SELECT members.id FROM members, members_to_groups WHERE members.id = members_to_groups.
所以我一直在研究 pthreads,特别是尝试计算两个矩阵的乘积。我的代码非常困惑,因为它本应是我自己的一个快速有趣的小项目,但我使用的线程理论非常类似于: #include #include #
我看到了被选中的answer对此post . 我很惊讶 (x & 255) == (x % 256) 如果 x 是无符号整数,我想知道总是替换 % 是否有意义& in x % n for n = 2^
Anaconda是什么? Anaconda 是一个开源的 Python 发行版本,主要面向数据科学、机器学习和数据分析等领域。它不仅包含了 Python 解释器本身,更重要的是集成了大量的用于科学计
我正在使用Ubuntu 14.04操作系统的g2.8xlarge EC-2实例上启用cuDNN的情况下运行py-faster-rcnn。一切都已编译,似乎工作正常。我通过以下方式登录到远程实例: ss
要求用户输入的简单程序可以使用 datainputstream 或扫描仪。哪个会更快? Datainputstream 是二进制的,所以它可能更快?有意见吗?我只是很好奇,因为我正在构建一个程序,我希
我正在 INRIA Person 数据集上训练 Faster-RCNN(VGG-16 架构)。我接受了 180,000 个训练步骤的训练。但是当我评估网络时,它会用相同的图像给出不同的结果。以下是图片
我是 python 新手,我为 Hackerrank 问题提交了此代码 Arrays and Simple Queries ,但对于大量测试用例,程序“由于超时而终止”。我怎样才能提高效率? 我已将主
如果将程序分成头文件和源文件,如果提供给智能编译管理器,可能会受益于更快的编译,这就是我正在研究的内容。 理论工作的意愿:为每个源文件创建一个线程并一次将每个源文件编译成目标文件。然后将这些目标文件链
方法一: SELECT * FROM `wordpressusers` WHERE user_login='user10000001' PhpMyadmin 的结果: 方法2: SELECT user
据我所知set.add使用FastFloat的equals方法 对我来说重要的只是点后的前两位数(!!!),所以在 equals 方法中我使用 Math.abs() >= 0.001 来使 equal
我是一名优秀的程序员,十分优秀!