问题标签 [micro-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++ - 调用空类的构造函数实际上是否使用任何内存?
假设我有一个像
然后我使用它调用它
这会导致在堆栈上分配任何内存以创建“空”对象吗?显然,参数需要被压入堆栈,但我不想产生任何额外的开销。基本上我将构造函数用作静态成员。
我想这样做的原因是因为模板。实际代码看起来像
这让我可以写类似的东西
这样我就可以专门化一个模板参数,而不必指定T
. 另外,我希望编译器能够优化构造函数内的其他分支。如果有人知道这是否属实或如何检查,将不胜感激。我还假设将模板放入这种情况并不会改变上面的“空类”问题,对吗?
c++ - 通过分析汇编列表来验证 gcc/g++ 中的编译器优化
我刚刚问了一个与编译器如何优化某些C++ 代码有关的问题,并且我正在寻找有关如何验证编译器是否执行某些优化的任何问题。我试图查看使用 g++ ( g++ -c -g -O2 -Wa,-ahl=file.s file.c
) 生成的程序集列表,以可能了解幕后发生的事情,但输出对我来说太神秘了。人们使用什么技术来解决这个问题,关于如何解释优化代码的汇编列表或讨论这个问题的特定于 GCC 工具链的文章是否有很好的参考?
c - CPU-Core线程分类功能
我将编写一个多线程共享内存消息传递系统,用于进程之间的超大容量消息传递。消息将来自网络服务器的工作线程。我想利用同一 CPU 共享上的内核的 CPU 缓存位置。因此,当我在这个 IPC 系统的接收端唤醒一个工作线程时,我会唤醒同一个 CPU 上的一个线程。
我需要Linux(最好是一般的POSIX)和windows API调用和我需要做的位掩码来提取信息,这些信息将让我使用以下结构从所述线程的上下文中对正在执行的线程ID进行分类:
两个平台的功能将不胜感激。我希望这可以在没有系统调用的情况下完成——即上下文切换。
- 编辑 -
我目前专注于 x86,但其他架构也会很有用。
c - C 中的微优化,有哪些?有没有真正有用的人?
我了解大多数微优化,但它们真的有用吗?
Exempli gratia:做++i
而不是i++
,while(1)
或者for(;;)
真的会导致性能改进(在内存指纹或 CPU 周期方面)?
所以问题是,在 C 中可以进行哪些微优化?它们真的有用吗?
.net - .Net 中没有“有效负载”值的字典
有时我需要检查一组值中的重复 ID,通常我为此使用字典 - 仅使用键并将值留空。
请注意,这是紧凑且高度优化的代码,因此请不要喊“过早优化”!假设 CPU 和 RAM 被挤压到极限的情况下,我想就更优化的解决方案收集意见;大概像 Lookup 类这样的东西会避免不必要的 RAM 分配,因此会稍微快一些。是否有第三方的此类课程,或者我在 BCL 中忽略的某些课程?
我知道谷歌已经发布了快速和紧凑字典类的代码——也许里面有可以移植到 C#/.Net 的东西?
谢谢。
jquery - JQuery:我的“滚动”事件非常慢。我究竟做错了什么?
我有 4 个DIV
希望scroll
在您滚动其中一个 div 时触发一个事件。这是下面的代码。
在 Firefox/Chrome 中,它运行得很快;但是,在 Internet Explorer 中,它运行得非常慢,以至于它实际上阻止了我滚动 div。
我正在使用最新版本的 JQuery (v.1.4.1)。
问题:有没有更有效的方式来运行上面的代码?如果是这样,怎么做?
更新:既然有人问了,我已经在我的整个代码下面包含了:
更新 2:
所以我在下面实现了计时器选项,在 IE 中,它仍然很慢。还有其他想法吗?
performance - 如何获得 2^k 的数字的 lg2
获得以 2 为底的对数的最佳解决方案是什么,我知道是 2 的幂 ( 2^k
)。(当然我只知道值2^k
而不知道k
它本身。)
我想到的一种方法是减去 1,然后进行位计数:
但是有没有更快的方法(没有缓存)?还有一些不涉及比特计数的东西会很高兴知道吗?
应用程序之一是:
为了在没有缓存的情况下比bitcount快,它应该比O(lg(k))
存储k
位的数量快。
c - 找出一个数字是偶数还是奇数的最快方法是什么?
找出一个数字是偶数还是奇数的最快方法是什么?
c# - 条件运算符慢吗?
我正在查看一些代码,其中每个案例都有一个巨大的 switch 语句和一个 if-else 语句,并立即感到优化的冲动。作为一个优秀的开发人员应该做的,我开始着手了解一些时间上的事实,并从三个变体开始:
原始代码如下所示:
/li>第二个变体转换为使用条件运算符:
/li>使用预填充键/字符对的字典的转折:
/li>
注意:这两个 switch 语句具有完全相同的大小写,并且字典具有相同数量的字符。
我期待 1) 和 2) 在性能上有点相似,而 3) 会稍微慢一些。
对于运行两次 10.000.000 次迭代以进行预热然后计时的每种方法,令我惊讶的是,我得到以下结果:
- 每次调用 0.0000166 毫秒
- 每次调用 0.0000779 毫秒
- 每次调用 0.0000413 毫秒
怎么会这样?条件运算符比 if-else 语句慢四倍,几乎比字典查找慢两倍。我在这里遗漏了一些重要的东西还是条件运算符天生很慢?
更新 1:关于我的测试工具的几句话。我在 Visual Studio 2010 的Release编译 .Net 3.5 项目下为上述每个变体运行以下(伪)代码。代码优化已打开,DEBUG/TRACE 常量已关闭。在进行定时运行之前,我会运行一次被测方法进行热身。run 方法执行该方法进行了大量迭代,shift
设置为 true 和 false,并使用一组选择的输入键:
Run 方法如下所示:
更新 2:进一步挖掘,我查看了为 1) 和 2) 生成的 IL,发现主开关结构与我预期的相同,但外壳主体略有不同。这是我正在查看的 IL:
1) if/else 语句:
2)条件运算符:
一些观察:
- 条件运算符在
shift
等于 true 时分支,而 if/else 在shift
为 false 时分支。 - 虽然 1) 实际上编译为比 2) 多一些指令,但在
shift
为真或假时执行的指令数对于两者来说是相等的。 - 1) 的指令顺序是始终只占用一个堆栈槽,而 2) 总是加载两个。
这些观察是否暗示条件运算符的执行速度会变慢?还有其他副作用起作用吗?
performance - 什么时候,如果有的话,循环展开仍然有用吗?
我一直在尝试通过循环展开来优化一些对性能至关重要的代码(一种在蒙特卡罗模拟中被调用数百万次的快速排序算法)。这是我试图加速的内部循环:
我尝试展开到类似的内容:
这完全没有区别,所以我把它改回更易读的形式。其他时候我也有过类似的经历,我尝试过循环展开。考虑到现代硬件上分支预测器的质量,循环展开何时(如果有的话)仍然是一种有用的优化?