问题标签 [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.
c - 哪个免费的 C 编译器提供了更大优化的选项?
您能否给我一些 C 编译器之间的比较,尤其是在优化方面?
c++ - 编译器围绕互斥边界重新排序?
假设我有自己的非内联函数 LockMutex 和 UnlockMutex,它们在内部使用了一些适当的互斥锁 - 例如 boost。编译器如何知道不对 LockMutex 和 UnlockMutex 调用的其他操作重新排序?它不可能知道我将如何在其他编译单元中实现这些功能。
ps:一个应该使用类的实例来持有锁以保证解锁。为了简化示例,我忽略了这一点。
optimization - 编译器优化会引入错误吗?
今天我和我的一个朋友讨论了几个小时关于“编译器优化”的问题。
我辩称,有时编译器优化可能会引入错误,或者至少会引入不希望的行为。
我的朋友完全不同意,说“编译器是由聪明的人构建的,做聪明的事情”,因此永远不会出错。
他根本没有说服我,但我不得不承认我缺乏现实生活中的例子来加强我的观点。
谁在这里?如果我是,您是否有任何现实生活中的示例,其中编译器优化会在生成的软件中产生错误?如果我弄错了,我应该停止编程并学习钓鱼吗?
c++ - 编译器优化导致性能下降
我有一个奇怪的问题。我有以下代码:
内部循环执行了近 200,000 次,整个函数需要 100 毫秒才能完成。(使用 AQTimer 分析)
double d = 0.0;
我在外循环外发现了一个未使用的变量 并将其删除。在此更改之后,突然该方法需要 500 毫秒来执行相同数量的执行。(慢 5 倍)。
这种行为在具有不同处理器类型的不同机器中是可重现的。(Core2,双核处理器)。
我正在使用具有优化级别的 VC6 编译器O2
。以下是使用的其他编译器选项:
我怀疑编译器优化并删除了编译器优化/O2
。在该功能变得正常之后,它需要 100 毫秒作为旧代码。
任何人都可以对这种奇怪的行为有所了解吗?
为什么当我删除未使用的变量时编译器优化会降低性能?
注意:汇编代码(更改之前和之后)看起来相同。
c# - 如果本地(但未使用)变量是对对象的唯一强引用,那么符合标准的 C# 编译器能否优化掉它?
另请参阅这些相关资源:
- .NET 垃圾收集器是否对代码进行预测分析?(关于堆栈溢出)
- WP7:GC 何时将局部变量视为垃圾(MSDN 上的博客文章)
换句话说:
是否可以在变量超出范围之前回收由局部变量引用的对象(例如,因为分配了变量,但随后不再使用),或者该对象是否保证在变量超出范围之前没有资格进行垃圾回收范围?
让我解释:
object
在这个代码示例中,我显然必须计划新的被垃圾收集器回收的可能性;因此if
声明。
(请注意,我使用weakRef
它的唯一目的是检查新版本object
是否仍然存在。)
与前一个代码示例相比,此代码示例的主要变化是 new'edobject
被局部变量 ( unusedLocalVar
) 强引用。weakRef
但是,在创建弱引用 ( )后,该变量将不再使用。
问题:是否允许符合标准的 C# 编译器将 的前两行优化为仅在一个地方使用的Case_2
那些,即作为构造函数的参数?即有没有可能断言 in可能会失败?Case_1
unusedLocalVar
WeakReference
Case_2
c++ - C++ 性能、优化编译器、.cpp 中的空函数
我有一个非常基本的类,将其命名为 Basic,几乎用于一个更大项目的所有其他文件。在某些情况下,需要有调试输出,但在发布模式下,这不应该被启用并且是 NOOP。
目前在标题中有一个定义,它根据设置打开或关闭 makro。因此,当关闭时,这绝对是一个 NOOP。我想知道,如果我有以下代码,编译器(MSVS / gcc)是否能够优化函数调用,使其再次成为 NOOP。(通过这样做,开关可以在 .cpp 中,并且切换会更快,编译/链接时间明智)。
sql - 通过添加索引列优化 SQL 数据库
假设我有一个看起来像这样的数据库;
ProductName 是 Product 的主键,是某种字符串类型,并且是唯一的。
OrderID 是主键并且是某种整数类型,而 ProductName 是外键。
假设我将 Product 的主键更改为整数类型的新列,即[ProductID]
.
这会减少数据库大小并优化连接这两个表的查找(以及类似的操作),还是这些优化是由(大多数/通用/主要) SQL 数据库实现自动执行的?
从技术上讲,使用 (String) ProductName 作为 inProduct
的主键,数据库应该能够将 ProductName 列Order
简单地实现为指向行的指针,并像使用整数作为外键一样快速地Product
执行 a ,这是标准吗? JOIN
SQL的实现方式。
更新: 这个问题是关于 SQL 服务器如何处理外键,而不是产品表是否需要序列号,或者我如何处理数据库中的产品名称更改。
.net - ToString() 是否由编译器优化?
假设我有以下代码:
将编译器优化为:
我已经用 IL Disassembler 检查了它,并且有调用
IL_005a: callvirt instance string [mscorlib]System.Object::ToString()
我不知道 JIT 是否对此进行了优化。
gcc - 使用 gcc 中的共享库可以进行配置文件引导优化吗?
我最近在 Linux 上推出了一个新的工具链,带有 gcc 4.5.0 和带有黄金的 binutils 2.20。现在我对PGO这个新事物很好奇。虽然很清楚它如何与可执行文件一起使用,但我无法在共享库上找到答案。我通过 google 在 gcc 邮件列表中找到了两个未答复的帖子,仅此而已。
所以这就是我尝试过的:只要我不标记 -fprofile-generate 一切都很好,并且我的 .so 由主程序 dlopen()'ed 并且可以完美地工作。当编译并与 -fprofile-generate 链接时,库被加载,一切正常,但是当我结束主程序时,我得到一个带有 coredump 的 sigsegv。
我将 corefile 提供给 gdb 并得到了这个:
当然,没有 .cdda 文件被保存。
有任何想法吗?
菲利普
c++ - 我将如何指示 extconf.rb 使用额外的 g++ 优化标志,哪些是可取的?
我正在使用Rice为 Ruby gem 编写 C++ 扩展。扩展名采用共享对象 (.so) 文件的形式。
这需要'mkmf-rice'而不是'mkmf',但两者(AFAIK)非常相似。
默认情况下,编译器使用标志-g -O2
。就个人而言,我觉得这种做法很愚蠢,因为启用任何优化都很难进行调试。我求助于编辑 Makefile 来删除我不喜欢的标志(例如,-fPIC -shared
当我需要使用main()
而不是 Ruby 的钩子进行调试时删除)。
但我认为必须有更好的方法。我知道我能做到
添加其他标志。但是如何在不直接编辑 Makefile 的情况下删除东西呢?
第二个问题:对于 Ruby 加载的共享对象,哪些优化是安全的?我可以做类似的事情-funroll-loops
吗?大家有什么推荐的?
这是一个科学计算项目,所以越快越好。内存不是什么大问题。