- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
使用 VC++ 的 __assume
是否可能带来可衡量的性能提升?如果是这样,请在您的答案中发布带有代码和基准的证明。
关于 __assume 的稀疏 MSDN 文章:http://msdn.microsoft.com/en-us/library/1b3fsfxw(v=vs.100).aspx
文中提到使用__assume(0)
通过__assume(0)
使
大小写。我测量到以这种方式使用 switch
语句更快>默认__assume(0)
没有性能提升:
void NoAssumeSwitchStatement(int i)
{
switch (i)
{
case 0:
vector<int>();
break;
case 1:
vector<int>();
break;
default:
break;
}
}
void AssumeSwitchStatement(int i)
{
switch (i)
{
case 0:
vector<int>();
break;
case 1:
vector<int>();
break;
default:
__assume(0);
}
}
int main(int argc, char* argv[])
{
const int Iterations = 1000000;
LARGE_INTEGER start, middle, end;
QueryPerformanceCounter(&start);
for (int i = 0; i < Iterations; ++i)
{
NoAssumeSwitchStatement(i % 2);
}
QueryPerformanceCounter(&middle);
for (int i = 0; i < Iterations; ++i)
{
AssumeSwitchStatement(i % 2);
}
QueryPerformanceCounter(&end);
LARGE_INTEGER cpuFrequency;
QueryPerformanceFrequency(&cpuFrequency);
cout << "NoAssumeSwitchStatement: " << (((double)(middle.QuadPart - start.QuadPart)) * 1000) / (double)cpuFrequency.QuadPart << "ms" << endl;
cout << " AssumeSwitchStatement: " << (((double)(end.QuadPart - middle.QuadPart)) * 1000) / (double)cpuFrequency.QuadPart << "ms" << endl;
return 0;
}
圆形控制台输出,1000000 次迭代:
NoAssumeSwitchStatement:46 毫秒
AssumeSwitchStatement:46ms
最佳答案
基准谎言。他们很少衡量你想让他们做什么。在这种特殊情况下,这些方法可能是内联的,因此 __assume
只是多余的。
至于实际问题,是的,它可能会有所帮助。开关通常由跳转表实现,通过减小该表的大小或删除一些条目,编译器可能能够选择更好的 CPU 指令来实现开关
。
在您的极端情况下,它可以将 switch
转换为 if (i == 0) { } else { }
结构,这通常是高效的。
此外,修剪死分支有助于保持代码整洁,更少的代码意味着更好地使用 CPU 指令缓存。
然而,这些都是微观优化,它们很少有返回:你需要一个分析器来指出它们,即使是它们也可能很难理解要进行的特定转换(是 __assume
最好的?)。这是专家的工作。
编辑:使用 LLVM
void foo(void);
void bar(void);
void regular(int i) {
switch(i) {
case 0: foo(); break;
case 1: bar(); break;
}
}
void optimized(int i) {
switch(i) {
case 0: foo(); break;
case 1: bar(); break;
default: __builtin_unreachable();
}
}
请注意,唯一的区别是是否存在 __builtin_unreachable()
,它类似于 MSVC __assume(0)
。
define void @regular(i32 %i) nounwind uwtable {
switch i32 %i, label %3 [
i32 0, label %1
i32 1, label %2
]
; <label>:1 ; preds = %0
tail call void @foo() nounwind
br label %3
; <label>:2 ; preds = %0
tail call void @bar() nounwind
br label %3
; <label>:3 ; preds = %2, %1, %0
ret void
}
define void @optimized(i32 %i) nounwind uwtable {
%cond = icmp eq i32 %i, 1
br i1 %cond, label %2, label %1
; <label>:1 ; preds = %0
tail call void @foo() nounwind
br label %3
; <label>:2 ; preds = %0
tail call void @bar() nounwind
br label %3
; <label>:3 ; preds = %2, %1
ret void
}
注意这里的switch
语句是如何在regular
中被优化成optimized
中的简单比较的。
这映射到以下 x86 程序集:
.globl regular | .globl optimized
.align 16, 0x90 | .align 16, 0x90
.type regular,@function | .type optimized,@function
regular: | optimized:
.Ltmp0: | .Ltmp3:
.cfi_startproc | .cfi_startproc
# BB#0: | # BB#0:
cmpl $1, %edi | cmpl $1, %edi
je .LBB0_3 | je .LBB1_2
# BB#1: |
testl %edi, %edi |
jne .LBB0_4 |
# BB#2: | # BB#1:
jmp foo | jmp foo
.LBB0_3: | .LBB1_2:
jmp bar | jmp bar
.LBB0_4: |
ret |
.Ltmp1: | .Ltmp4:
.size regular, .Ltmp1-regular | .size optimized, .Ltmp4-optimized
.Ltmp2: | .Ltmp5:
.cfi_endproc | .cfi_endproc
.Leh_func_end0: | .Leh_func_end1:
请注意,在第二种情况下:
另请注意,它是如此之近,以至于我不知道如何测量噪音以外的任何东西......
另一方面,从语义上讲,它确实指示了一个意图,尽管 assert
可能更适合仅用于语义。
关于c++ - 使用 VC++ 的 __assume 是否可能带来可衡量的性能提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504206/
当今的大多数处理器都配备了硬件性能计数器。此类计数器可用于对微架构事件进行计数,以便分析目标程序以提高其性能。通常,分析和分析是这些计数器的主要目标。 根据文献中的研究论文,这些计数器缺乏准确性。例如
提前声明一下,我对SQL查询的算法了解甚少,请原谅我的无知。 我的问题是:您如何评估特定 SQL 查询的性能?考虑了哪些指标? 例如, SELECT * FROM MyTable; 和 SELECT
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
大多数编程语言中方法的复杂度可以用静态源代码分析器的圈复杂度来衡量。是否有类似的度量标准来衡量 SQL 查询的复杂性? 测量查询返回所需的时间很简单,但是如果我只想量化查询的复杂程度怎么办? [编辑/
我正在开发一个至少有 15 年历史的应用程序。我正在致力于提高具有大约 10K 行代码的特定流程的性能。此流程涉及向外部系统发送有关 JMS 主题的信息。我在创建和缓存 session 的方式中发现了
我如何衡量 Clojure 程序使用了多少内存? 我已经注意到,即使是小程序,也就是这样说 (println "Hello World") 可以消耗几十兆内存,按时间(GNU时间),ps 和其他类似的
我正在开发一个 jQuery 插件,但我不知道哪个版本的 jQuery 是我的插件运行的最小版本。 有什么方法可以衡量我的 jQuery 插件的要求吗? 最佳答案 一些想法: 我没有使用过这个,但快速
我有一个 JavaScript 文件,它接受一个输入,用它做一些计算,然后返回一个结果。现在,我想测量它的性能,例如检查运行 1.000 个输入需要多少时间。问题是我几乎不了解 Javascript(
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 6年前关闭。 Improve this questi
使用 Play 框架测试(未部署的)应用程序性能的最佳工具是什么?比如,请求执行需要多长时间,使用不同的参数,模拟大量请求(压力测试)等。 我搜索了一段时间,但问题是关键字“performance”、
我想知道是否有人知道一个好的 Java 库可以用来衡量 HTML 等效性? 例如相当于 .我想使用 Java 以这种方式比较整个多行 html 字符串。 有什么建议吗? 更新: 所以我尝试使用 Xm
我目前正在使用 VisualVM,但我遇到的问题是我无法保存它生成的图表。我需要报告有关其内存使用情况和运行时间的一些数据,尽管使用 System.nanoTime() 很容易获得运行时间。我也尝试过
我正在尝试对我们的前端进行全面分析,我想知道是否有任何工具可以自动测量 Javascript。 例如: 函数的执行(不需要我在记录之前/之后手动放置日期对象) 我页面上的哪个脚本最慢,为什么 找出我需
假设我有一个有 1000 个并发用户的应用。 衡量 Tomcat 性能的最佳方法是什么?如何确定最大数据库连接数(池)? 如何追踪内存泄漏、CPU 泄漏? 最佳答案 Let's say that I
我需要衡量 React Native 应用程序的性能。什么是最好的工具? 我在 google chrome 中尝试使用 google trace,在 iOS 平台上尝试使用 mac 中的 Instru
我有一些 xaml 文件在整个应用程序中使用。我希望编写单元测试来测试每个 xaml 文件的性能,换句话说,加载/解析和呈现其中一个窗口(使用某些 xaml 文件)需要多长时间。 我发现 XamlRe
我有一个 Web 应用程序,其中包含多个用于 B2B 应用程序的同质 Web 前端(具体来说,我在 App Engine 上运行)。我需要设计一个短期配额系统,以便在客户的突发请求率超过他们的配额时拒
有什么方法可以衡量 Redis Lua 脚本的性能吗? 我有一个 lua 脚本,我最终得到了一个略有不同的实现,我想知道是否有任何方法可以衡量这两个实现中哪个更快。 最佳答案 您可以调用 Redis
我使用 qperf 工具测量 AWS EC2 实例之间的延迟。首先,我测试了两个 c5xlarge 实例之间的 tcp 延迟,我得到了 30 微秒的延迟。后来我终止了这些实例并在新的两个 c5xlar
哪个影响最大? 在 Release模式和 Debug模式下构建 ASP.NET 应用程序 设置在 web.config 中 考虑到性能和内存使用情况,是否有人进行过任何测试以获取有关差异的实际数字?
我是一名优秀的程序员,十分优秀!