问题标签 [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 - 性能或代码大小的 C 编码实践 - 超出编译器的功能
我正在寻找程序员在 C 中可以做什么,这可以确定生成的目标文件的性能和/或大小。
例如,
1. 将简单的 get/set 函数声明为内联可能会提高性能(以更大的占用空间为代价)
2. 对于不使用循环变量本身的值的循环,倒数到零而不是数到某个值等
看起来编译器现在已经发展到根本不需要“简单”技巧(如上面两点)的水平。Appropriate options during compilation do the job anyway. 哎呀,我还在这里看到了关于编译器如何处理递归的帖子——这非常有趣!那么我们在 C 级别还剩下什么要做呢?:)
我的具体环境是:GCC 4.3.3 re-targeted for ARM architecture (v4)。但是也欢迎对其他编译器/处理器的响应,并将被咀嚼。
PS:我的这种方法违背了通常的“代码优先!,然后是基准测试,最后是优化”的方法。
编辑:就像它发生的那样,我在发布问题后发现了一个类似的帖子:我们是否仍然应该“在小范围内”进行优化?
c - C中的快速欧几里得除法
我有兴趣获得欧几里得除法的余数,即对于一对整数 (i, n),找到 r,例如:
简单的解决方案是:
但是由于我需要执行数千万次(它在多维数组的迭代器中使用),所以我想尽可能避免分支。要求:
- 分支但更快也是可取的。
- 仅适用于正 n 的解决方案是可以接受的(但它必须适用于负 i)。
- n 事先不知道,可以是 > 0 且 < MAX_INT 的任意值
编辑
实际上很容易得到错误的结果,所以这里是一个预期结果的例子:
- euc(0, 3) = 0
- euc(1, 3) = 1
- euc(2, 3) = 2
- euc(3, 3) = 0
- euc(-1, 3) = 2
- euc(-2, 3) = 1
- euc(-3, 3) = 0
也有人担心优化这个没有意义。我需要一个多维迭代器,其中超出范围的项目被重复原始数组的“虚拟数组”中的项目替换。所以如果我的数组 x 是 [1, 2, 3, 4],虚拟数组是 [...., 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],例如, x[-2] 是 x 1等...
对于维度 d 的 nd 数组,我需要对每个点进行 d 欧几里得除法。如果我需要在一个 ^d 数组与 am^d 内核之间进行关联,我需要 n^d * m^d * d 欧几里得除法。对于 100x100x100 点的 3d 图像和 5*5*5 点的内核,这已经是约 4 亿欧几里得分割。
assembly - 使用 xor reg, reg 是否比 mov reg, 0 更有优势?
有两种众所周知的方法可以在 x86 上将整数寄存器设置为零值。
任何一个
或者
有一种观点认为第二种变体更好,因为值 0 没有存储在代码中,并且节省了生成的机器代码的几个字节。这绝对是好的——使用更少的指令缓存,这有时可以加快代码执行速度。许多编译器产生这样的代码。
然而,在 xor 指令和任何更改同一寄存器的早期指令之间存在正式的指令间依赖关系。由于存在依赖性,后一条指令需要等到前一条指令完成,这可能会减少处理器单元的负载并损害性能。
很明显,无论初始寄存器值如何,异或的结果都将完全相同。但它的处理器能够识别这一点吗?
我在 VC++7 中尝试了以下测试:
关闭优化后,两个循环的时间完全相同。这是否合理地证明处理器认识到指令不依赖xor reg, reg
于先前的mov eax, 0
指令?有什么更好的测试来检查这一点?
java - 智能 JVM 和 JIT 微优化
随着时间的推移,Sun 的 JVM 和 JIT 变得非常聪明。过去作为必要的微优化的常识已经不再需要,因为它会为您处理好。
例如,过去的情况是您应该将所有可能的类标记为最终类,因此 JVM 内联尽可能多的代码。但是现在,JIT 根据在运行时加载的类知道您的类是否是最终类,如果您加载一个类以使原始类不可最终化,它会取消内联方法并将其取消标记为最后。
JVM 或 JIT 还为您做了哪些其他智能微优化?
编辑:我把它做成了一个社区维基;我想随着时间的推移收集这些。
php - PHP函数执行成本表
有一个参考表显示每个php函数的执行成本?
我知道时间执行受许多因素的限制,不可能确定一个独特的价值,但我正在寻找一个“意识形态”表。
例如,
(以它为例;)
如果我不记得不好,对于 C 有一个表,其中包含每个操作所需的 cpu 周期..
编辑:我阅读了你所有的评论,所以有任何表格可以满足我的需要。
无论如何,我知道
但是,我很难接受这种情况(如果我理解你的话,是可能的);
java - 将网页内容读入 Java 字符串的最佳方法是什么?
我有以下 Java 代码来获取给定 URL 处 HTML 页面的全部内容。这可以以更有效的方式完成吗?欢迎任何改进。
我不禁觉得线路阅读不是最佳的。我知道我可能掩盖了电话MalformedURLException
引起的问题openConnection
,我对此没有意见。
我的函数还具有使 HTML 字符串具有当前系统的正确行终止符的副作用。这不是要求。
我意识到网络 IO 可能会使读取 HTML 所需的时间相形见绌,但我仍然想知道这是最优的。
附带说明:如果StringBuilder
有一个 open 的构造函数,InputStream
它会简单地获取所有内容InputStream
并将其读入StringBuilder
.
css - 优化 CSS:Narrow Definition (#mytable tbody span.myclass) 更好?
我想知道是否有一个“狭隘”的定义,例如
比解析更好/更快
我在某处读到,狭义的定义实际上对 CSS 速度有某种不利影响,但我不记得在哪里而且已经有一段时间了,所以我只想澄清它是否重要,如果重要,哪种解决方案更好/更快。
谢谢!
c - 结构的 C 指针与直接成员访问
假设我有一个如下结构......
...而且我有一个这种类型的全局变量(我很清楚全局变量的陷阱,这是针对嵌入式系统的,我没有设计它,它们是不幸但必要的邪恶。 ) 直接或通过指针访问结构的成员是否更快?IE
或者
我的任务之一是简化和修复最近继承的嵌入式系统。
python - Python 中什么更快,“while”或“for xrange”
我们可以像这样进行数字迭代:
在 C 风格中:
是的,我知道,第一个更不容易出错,更 Pythonic,但它是否足够快作为 C 样式版本?
PS。我来自 C++ 星球,对 Python 来说还很陌生。
java - Java,最昂贵的语句?
Java 编程语言中最昂贵的语句(字节码和 CPU 周期)是什么?