问题标签 [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.
java - ' ... != null' 还是 'null != ....' 性能最好?
我写了两种方法来检查那里的性能
并在编译后检查它的字节码
这里使用两个操作码来实现 if 条件:在第一种情况下,它使用 ifnull- 检查堆栈的顶部值为 null-,在第二种情况下,它使用 if_acmpeq-检查堆栈中的顶部两个值是否相等-
那么,这会对性能产生影响吗?(这将帮助我证明 null 的第一个实现在性能方面以及在可读性方面都很好:))
javascript - Javascript 范围链
我正在尝试优化我的程序。我想我了解关闭的基础知识。不过,我对范围链感到困惑。
我知道通常你想要一个低范围(快速访问变量)。
假设我有以下对象:
我的理解是,如果我在 some_public 方法中,我可以比公共变量更快地访问私有变量。它是否正确?
我的困惑来自this的范围级别。
当代码在调试器处停止时,firebug 会在this关键字中显示公共变量。this字不在范围级别内。
访问它的速度有多快?现在我将任何 this.properties 存储为另一个局部变量,以避免多次访问它。
非常感谢!
assembly - x86 操作码对齐参考和指南
我正在 JIT 编译器中动态生成一些操作码,并且正在寻找操作码对齐的指南。
1)我已经阅读了通过在调用后添加 nop 来简要“推荐”对齐的评论
2)我还阅读了有关使用 nop 优化序列以实现并行性的信息。
3)我读过操作对齐有利于“缓存”性能
通常这些评论不提供任何支持参考。阅读博客或评论说“这样做是个好主意”是一回事,但实际编写实现特定操作序列并在线实现大多数材料(尤其是博客)的编译器是另一回事用于实际应用。所以我相信自己会发现事情(反汇编等,看看现实世界的应用程序做了什么)。这是我需要一些外部信息的一种情况。
我注意到编译器通常会在之前的任何指令序列之后立即启动奇数字节指令。所以编译器在大多数情况下并没有特别注意。我在这里或那里看到“nop”,但通常似乎很少使用 nop,如果有的话。操作码对齐有多重要?您能否为我可以实际用于实施的案例提供参考?谢谢。
java - java中参数化ArrayLists的通用数组?
我是 Java 新手,所以我不知道细节。
为什么我不能创建参数化 ArrayList 的通用数组?
相反,我必须写,
或者我必须创建 ArrayLists 列表。
数组不应该比 ArrayLists 更有效吗?那么为什么Java不允许呢?
另外,以下两行之间有什么区别。
java - 倒数到零与倒数到长度相反 - 1
是否建议在小循环中(在可能的情况下)从长度 - 1 计数到零,而不是计数到长度 - 1?
1.) 倒计时
2.) 数数
第一个比第二个稍快(因为与零相比更快),但在我看来更容易出错。此外,第一个可能无法通过 JVM 的未来改进来优化。有什么想法吗?
python - Python 中异常处理程序的成本
在另一个问题中,接受的答案建议用 try/except 块替换 Python 代码中的(非常便宜的)if 语句以提高性能。
抛开编码风格问题不谈,假设永远不会触发异常,那么拥有一个异常处理程序与没有一个异常处理程序与拥有一个与零比较的 if 语句有多大区别(在性能方面)?
java - Java >> 和 >>> 右移运算符之间的性能有何不同?
有没有理由认为 Java 中的 >>(有符号)和 >>>(无符号)右位移运算符会执行不同的操作?我无法在我的机器上检测到任何差异。
这纯粹是一个学术问题;我敢肯定,它永远不会成为瓶颈。我知道:最好把你最想说的写出来;例如,使用 >> 除以 2。
我认为归结为哪些架构将哪些操作作为指令实现。
c++ - 从紧密的内部循环调用微小函数的开销?[C++]
假设你看到一个像这样的循环:
如果这是 Java,我可能不会三思而后行。但是在 C++ 的性能关键部分,它让我想修改它......但是我不知道编译器是否足够聪明以至于它是徒劳的。这是一个虚构的示例,但它所做的只是将字符串插入容器中。请不要假设其中任何一个都是 STL 类型,请笼统地考虑以下内容:
- for 循环中有一个混乱的条件每次都会被评估,还是只评估一次?
- 如果这些 get 方法只是返回对对象上成员变量的引用,它们会被内联吗?
- 您是否希望自定义 [] 运算符得到优化?
换句话说,是否值得花时间(仅在性能上,而不是在可读性上)将其转换为以下内容:
请记住,这是一个紧密的循环,每秒调用数百万次。我想知道的是,所有这些是否会在每个循环中减少几个周期或更重要的东西?
是的,我知道关于“过早优化”的报价。而且我知道分析很重要。但这是一个关于现代编译器的更普遍的问题,尤其是 Visual Studio。
optimization - 优化 css vs Google 页面速度让我很困惑
我正在使用谷歌页面速度,它告诉我我的 css 效率低下......
非常低效的规则(适合在任何页面上修复):
CSS规则是
我希望页眉和页脚的背景颜色与表的主体(数据表)不同
- 这是因为什么原因是低效的?
- 如何让它更有效率?
为了谷歌的缘故,我不会在 thead 和 tfoot 中添加一个类。
c++ - 函数局部静态常量变量初始化语义
这些问题以粗体显示,适用于那些不想深入阅读问题的人。
这是对这个问题的跟进。它与函数中静态变量的初始化语义有关。静态变量应该初始化一次,它们的内部状态可能会在以后改变——就像我(目前)在链接问题中所做的那样。但是,有问题的代码不需要该功能稍后更改变量的状态。
让我澄清一下我的立场,因为我不需要更改字符串对象的内部状态。该代码用于元编程的特征类,因此将受益于 const char * const ptr - 因此理想情况下需要本地成本静态 const 变量。我有根据的猜测是,在这种情况下,有问题的字符串将由链接加载器最佳地放置在内存中,并且代码更安全并映射到预期的语义。
这导致了这样一个变量的语义“C++ 编程语言第三版——Stroustrup”没有任何(我能找到的)关于这个问题的说法。所说的只是当线程的控制流第一次到达代码时,变量被初始化一次。这让我思考以下代码是否合理,如果不是,那么预期的语义是什么?
以下在 GCC 上编译并打印“yahoo”两次。这就是我想要的——但是它可能不符合标准(这就是我发布这个问题的原因)。有两个函数可能更优雅,“SetString”和“String”,后者转发到第一个。如果它符合标准,是否有人知道 boost(或其他地方)中的模板实现?
编辑:2010 年 5 月 11 日
我正在使用以下宏在我的类中生成上述的 getter/setter 来编码编译时间信息。
这些宏被放置在类声明中。例如:
希望这对其他人有用。