- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我如何向学生展示likely
和unlikely
编译器提示 (__builtin_expect
) 的可用性?
你能写一个示例代码吗,与没有提示的代码相比,有这些提示的代码会快几倍。
最佳答案
这是我使用的斐波那契数列的一个非常低效的实现:
#include <stdio.h>
#include <inttypes.h>
#include <time.h>
#include <assert.h>
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
uint64_t fib(uint64_t n)
{
if (opt(n == 0 || n == 1)) {
return n;
} else {
return fib(n - 2) + fib(n - 1);
}
}
int main(int argc, char **argv)
{
int i, max = 45;
clock_t tm;
if (argc == 2) {
max = atoi(argv[1]);
assert(max > 0);
} else {
assert(argc == 1);
}
tm = -clock();
for (i = 0; i <= max; ++i)
printf("fib(%d) = %" PRIu64 "\n", i, fib(i));
tm += clock();
printf("Time elapsed: %.3fs\n", (double)tm / CLOCKS_PER_SEC);
return 0;
}
为了演示,使用 GCC:
~% gcc -O2 -Dopt= -o test-nrm test.c
~% ./test-nrm
...
fib(45) = 1134903170
Time elapsed: 34.290s
~% gcc -O2 -Dopt=unlikely -o test-opt test.c
~% ./test-opt
...
fib(45) = 1134903170
Time elapsed: 33.530s
少了几百毫秒。这一 yield 归功于程序员辅助的分支预测。
但是现在,对于程序员真正应该做的事情:
~% gcc -O2 -Dopt= -fprofile-generate -o test.prof test.c
~% ./test.prof
...
fib(45) = 1134903170
Time elapsed: 77.530s /this run is slowed down by profile generation.
~% gcc -O2 -Dopt= -fprofile-use -o test.good test.c
~% ./test.good
fib(45) = 1134903170
Time elapsed: 17.760s
借助编译器辅助的运行时分析,我们设法从原来的 34.290 秒减少到 17.760 秒。比程序员辅助的分支预测要好得多!
关于c - likely() 和 unlikely() 编译器提示的学习示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2738835/
我最近为我的漫画网站实现了自定义喜欢和不喜欢功能。我想让用户能够通过“取消单击”喜欢或不喜欢按钮来“收回”他们的选择。 我的函数的工作原理是: 1) Passing button value (id
我在 Linux 内核代码中遇到了这两个宏。我知道它们是编译器 (gcc) 的指令,用于在分支情况下进行优化。我的问题是,我们可以在用户空间代码中使用这些宏吗?它会提供任何优化吗?任何例子都会很有帮助
FB.Event.subscribe('edge.create', function(response) { alert ('liked!') } ); 如何查看反向 A
我想创建一个像 Facebook 和 Instagram 一样的喜欢/不喜欢功能。 这就是我正在做的事情 Boolean clicked = true; public void onLikeClic
我正在按照 youtube 上的教程为我的状态系统制作一个简单的喜欢/不喜欢按钮,我完成了大部分工作,但它不会更新我的喜欢,也不会将喜欢插入数据库,请帮我说怎么了,我已经尝试了很多了.. 获取状态的函
这个问题已经有答案了: How do the likely/unlikely macros in the Linux kernel work and what is their benefit? (1
我在 Tumblr 上添加了一个 Facebook Like 按钮博客(在模板中):iFrame 代码和 Open Graph标签。该按钮通常显示在每篇博客文章下方。当我单击该按钮时,它会将其状态更改
我如何向学生展示likely 和unlikely 编译器提示 (__builtin_expect) 的可用性? 你能写一个示例代码吗,与没有提示的代码相比,有这些提示的代码会快几倍。 最佳答案 这是我
我想在 codeigniter 中实现类似和不同的功能。我可以使用以下代码在普通的 php 中执行此操作,但我只是不明白为什么它在下面的 codeigniter 中不起作用是我的数据库表以及我的模型
在我的示例中,Google Chrome 36 似乎已损坏并且无法理解 top:50%。 IE 11、Opera 12.17 和 Firefox 31 运行良好。 Chrome 和 Safari 坏了
我了解 likely()/unlikely() 宏的工作原理,也了解分支预测。不幸的是,我没有在高级编程的背景下学习分支预测。 我想知道的是,如果 likely/unlikely 宏中的评估导致段错误
这应该很容易,但我有时间。为什么 ORDER BY with LIKE 会将匹配的结果排序为比不匹配的更高的值?为了获得我期望的结果,我必须在其他方面相同的数据上混合使用 ASC 和 DESC: cr
我一直在深入研究 Linux 内核的某些部分,发现了这样的调用: if (unlikely(fd < 0)) { /* Do something */ } 或 if (likely(!err)
我正在为我的网站实现我自己的喜欢/不喜欢系统。 PHP 部分已经完成并且一切正常,但我正在尝试使 Like/Unlike 过程与 jQuery 的 AJAX 方法完全异步。 我想要实现的是让用户按下赞
目标: 我正在尝试创建一个按钮,允许用户为网站上的帖子点赞(类似于 Facebook 的做法),这也会增加/减少点赞的数量除了按钮之外。 问题:除一种极端情况外,一切正常。如果用户已经喜欢该帖子,他可
我的应用程序目前允许用户喜欢和不喜欢他们 Feed 中的帖子,包括来自其他用户/ friend 的帖子。 当我启用 2013 年 2 月的重大更改时,我的应用程序仍然可以喜欢其他用户的帖子(POST
初步资料:根据近期ISO C++ Committee Trip Report ,条件分支的 [[ likely ]] 和 [[ unlikely ]] 属性将添加到 C++20 中,并且在最新版本的
如果我有: #define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0
我目前正在编写一个小型地理定位应用程序,与 Google Location History 非常相似. Android 手机定期将其位置发送到服务器,然后我可以在 map 上显示它们。我使用 Java
C++20 已经很方便 [[likely]]/[[unlikely]]指导代码生成的属性。例如,您可以指定一个分支可能被以下人员采用: if (b) [[likely]] { /*...*/ } 同样
我是一名优秀的程序员,十分优秀!