问题标签 [compiler-optimization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 使用线程和非阻塞同步时需要注意哪些编译器、CLR 或 CPU 优化?
正如标题所说,在使用线程和非阻塞同步时需要注意哪些编译器、CLR 或 CPU 优化?
我已经阅读了一些关于指令重新排序以提高效率的内容,这可能会破坏事情,以及缓存优化会导致变量立即对其他线程不可见[0],但是还有其他(我确定有)我需要注意什么?
任何指向推荐阅读/博客/文章/等的链接将不胜感激。
谢谢,埃吉尔。
更新:感谢 Jons 链接到 Joe Duffy 的博客文章,我发现了更多很棒的信息,我想我会与你们分享:
- 许多人指出的主要文章是Vance Morrison的《了解低锁技术在多线程应用程序中的影响》 。
- What Every Dev Must Know About Multithreaded Apps,同样由 Vance Morrison 撰写,对于我们这些不每天涉足多线程应用程序的人来说,这是一个非常好的更新。
- Joe Duffy 的9 Reusable Parallel Data Structures and Algorithms也是一本不错的读物。
- Jeffrey Richter 在他的并发事务专栏 Performance-Conscious Thread Synchronization中的更多内容。他对 SpinWaitLock 的实现非常好。
- 总的来说,MSDN Magazine 上的 Concurrency Affairs 专栏非常值得推荐。
c - 是否可以告诉分支预测器跟随分支的可能性有多大?
为了清楚起见,我不打算在这里进行任何形式的可移植性,因此任何将我绑定到某个盒子的解决方案都可以。
基本上,我有一个 if 语句,它将 99% 的时间评估为真,并且我试图在最后一个时钟的性能上勉强,我可以发出某种编译器命令(使用 GCC 4.1.2 和 x86 ISA,如果重要)告诉分支预测器它应该为那个分支缓存?
c++ - C++0x 内存模型和推测加载/存储
所以我正在阅读有关即将推出的 C++0x 标准的一部分的内存模型。但是,我对允许编译器执行的某些限制感到有些困惑,特别是关于推测加载和存储的限制。
首先,一些相关的东西:
Hans Boehm 关于线程和 C++0x 中的内存模型的页面
Sutter,“棱镜:微软本机代码平台的基于原则的顺序内存模型”,N2197
现在,基本思想本质上是“无数据争用程序的顺序一致性”,这似乎是在易于编程和允许编译器和硬件机会优化之间的一个不错的折衷。如果不同线程对同一内存位置的两次访问没有排序,则定义为发生数据竞争,其中至少一次存储到内存位置,并且至少一次不是同步操作。这意味着对共享数据的所有读/写访问都必须通过某种同步机制,例如互斥锁或对原子变量的操作(好吧,可以仅对专家以宽松的内存顺序对原子变量进行操作,但默认提供为了顺序一致性)。
鉴于此,我对普通共享变量上的虚假或推测加载/存储的限制感到困惑。例如,在 N2338 中,我们有示例
不允许编译器转换成
因为如果 y == 2 存在对 x 的虚假写入,如果另一个线程同时更新 x,这可能是一个问题。但是,为什么这是一个问题?这是一场数据竞赛,无论如何都是被禁止的;在这种情况下,编译器通过两次写入 x 只会使情况变得更糟,但即使是一次写入也足以进行数据竞争,不是吗?即一个合适的 C++0x 程序需要同步对 x 的访问,在这种情况下将不再存在数据竞争,并且虚假存储也不会成为问题?
I'm similarly confused about Example 3.1.3 in N2197 and some of the other examples as well, but maybe an explanation for the above issue would explain that too.
EDIT: The Answer:
The reason why speculative stores are a problem is that in the switch statement example above, the programmer might have elected to conditionally acquire the lock protecting x only if y != 2. Hence the speculative store might introduce a data race that was not there in the original code, and the transformation is thus forbidden. The same argument applies to Example 3.1.3 in N2197 as well.
c# - 错误仅在启用编译优化时发生
我在代码中遇到了一个错误,只有在启用优化的情况下构建代码时才会重现该错误。我制作了一个控制台应用程序,它复制了测试逻辑(下面的代码)。您会看到,启用优化后,执行此无效逻辑后,“值”变为空:
修复很简单,并在有问题的代码下方注释掉。但是......我更担心我可能在汇编程序中遇到了一个错误,或者其他人可能解释了为什么 value 设置为 null。
正常输出应该是:
错误的输出是:
我的 Env 是一个运行带有 .NET 3.5 SP1 的 Windows Server 2003 R2 的 VM。使用VS2008团队系统。
谢谢,
布赖恩
c - C 编译器如何实现返回大型结构的函数?
函数的返回值通常存储在堆栈或寄存器中。但是对于大型结构,它必须在堆栈上。这段代码在真正的编译器中必须进行多少复制?还是优化了?
例如:
(假设函数不能内联..)
c++ - 当编译器知道长度时,为什么不优化字符串赋值?
我今天正在玩一些计时代码,发现当将字符串文字分配给 std::string 时,它的速度大约快了 10%(使用较短的 12 字符字符串,因此对于大字符串可能会有更大的差异)这样做使用已知长度的文字(使用 sizeof 运算符)而不是。(仅用 VC9 编译器测试过,所以我猜其他编译器可能会做得更好)。
现在我怀疑的原因是它必须调用 strlen (VC9 进入汇编程序,这不是我的强项,所以我不能 100% 确定)来获取字符串长度,然后像第二种情况一样做同样的事情。
考虑到 std::string 已经存在了多长时间,以及第一种情况在现实世界的程序中有多常见(特别是如果你包含 +、=、+= 等运算符和等效方法),它为什么不优化第一种情况进入第二个?如果它是一个 std::basic_string 对象和一个文字,似乎也很简单,就好像它像 b 一样编写它?
vb.net - VB.NET Select Case 编译器优化?
VB.NET 2008 编译器是否有选择性地优化 Select Case 语句?
例如,可以将具有足够数量的整数情况的 Select Case 语句组织为二进制搜索。
我问这个是因为我很好奇是否应该选择 Select Case 来代替具有多个 Else If 的 If 语句,其中比较整数或其他基本数据类型。
c++ - 在 C++ 中使用对象时对性能的影响
我有一个用于 C++ 中背包的动态编程算法。当它被实现为一个函数并访问传递给它的变量时,它需要 22 秒才能在特定实例上运行。当我将它作为我的类 KnapsackInstance 的成员函数并让它使用作为该类数据成员的变量时,它开始需要 37 秒才能运行。据我所知,只有访问成员函数会通过 vtable,所以我无法解释可能发生的事情。
这是函数的代码
tbl 是 DP 表的一列。我们从第一列开始,一直到最后一列。ProfitWeights 变量是成对的向量,其中第一个元素是利润,第二个元素是权重。toret 是要返回的值。
这是原始函数的代码:-
这是在 Debian Lenny 上运行 g++-4.3.2 和 -O3 -DNDEBUG 打开的
谢谢
c++ - C++ 复制构造函数、临时对象和复制语义
对于这个程序
我得到的输出是:
由于f()
是按值返回,它应该返回一个临时的。照原样,T a = x;
它T a(x);
不会调用复制构造函数来构造a
,并将临时传入作为其参数吗?
c - 如何关闭 gcc 编译器优化以启用缓冲区溢出
我正在处理一个需要禁用编译器优化保护才能工作的作业问题。我在 ubuntu linux 上使用 gcc 4.4.1,但不知道哪些标志是正确的。我意识到它依赖于架构 - 我的机器运行 w/ 32 位英特尔处理器。
谢谢。