问题标签 [inlining]
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.
php - 他们说 HTML 中的 javascript 代码被认为是不好的做法,如何解决这个问题?
因此,我知道将 javascript 混合到 HTML 中是不好的,即使在头脑中也是如此。但是让我们看看这段代码(我想从列表中删除项目)
此列表由 PHP 生成。deleteThisItemById() 位于外部.js
文件中。这仍然被认为是坏事吗?如果是这样,规范的解决方案是什么?jQuery 是可以接受的,原始的 javascript 也是如此。
gnuplot - 没有文本文件的 Gnuplotting 多图数据
我刚刚阅读了没有 textfile 的 Gnuplotting 数据,我想做同样的事情,但使用“多图”。我目前有:
我想将数据内联到data.csv
.
c# - C# 优化器性能不佳?
我刚刚写了一个小例子来检查 C# 的优化器在索引器的情况下如何表现。这个例子很简单——我只是将一个数组包装在一个类中并尝试填充它的值:一次直接,一次通过索引器(它在内部访问数据的方式与直接解决方案完全相同)。
许多 SO 帖子告诉我,程序员应该高度信任优化器来完成它的工作。但在这种情况下,结果非常令人惊讶:
(在发布配置中编译并进行了优化,我仔细检查了)。
这是一个巨大的差异 - 绝不是统计错误(它既可扩展又可重复)。
这是一个非常令人不快的惊喜:在这种情况下,我希望编译器内联索引器(它甚至不包括任何范围检查),但它没有这样做。这是反汇编(注意,我的评论是对正在发生的事情的猜测):
直接的
通过索引器
这完全是一场灾难(就代码优化而言)。所以我的问题是:
- 为什么这段代码(实际上很简单)没有得到适当的优化?
- 如何修改此代码,使其按我想要的方式进行优化(如果可能)?
- 程序员能否像依赖 C++ 的优化器一样依赖 C# 的优化器?
好的,我知道,最后一个很难回答。但是最近我读到了很多关于 C++ 性能的问题,并且对优化器能做多少感到惊讶(例如,完全内联std::tie
、两个std::tuple
ctor 和动态重载opeartor <
)。
编辑:(回应评论)
看来,这实际上仍然是我的错,因为我在运行 IDE时检查了性能。现在,我从 IDE 中运行了相同的程序,并通过即时调试器附加到它。现在我得到:
直接的
索引器
这些代码完全相同(就 CPU 指令而言)。运行后,索引器版本比直接版本获得了更好的结果,但只是(我猜)因为缓存。将测试放入循环后,一切恢复正常:
出色地; 学过的知识。即使在 Release 模式下编译,程序是在 IDE 中运行还是在 Standalone 中运行都有很大的不同。感谢@harold 的想法。
c# - JIT 内联私有字段会从另一个类访问吗?
我有一些属性用于访问父类中的字段,如下所示:
A类:
B 类:A:
我的问题是,如果我访问B.Number
,它是否仍会解析为直接访问A._number
(+1)?
当然,这是假设一个优化的发布版本。
更重要的是,访问修饰符是抽象的(因为它们仅在编译时很重要,并且在运行时对代码没有影响),还是它们实际上会在运行时限制访问(当然,使用反射时除外)?
c++ - gcc 多重定义...仅发布
我在头文件中定义了一个函数。在调试中,它可以很好地编译和链接。在发行版中,对于包含标头的每个类的每个目标文件,我都会收到编译错误“`blah::blah(blah& blah)' 的多重定义”。
我正在使用 gcc-4.8.1。我无法发布实际代码,这个版本已更改名称以保护无辜者:
我一直无法找到哪个 gcc 标志负责。当然,修复只是将实现移动到 cpp 文件中。但为什么这是必要的?为什么这只会在发布时发生?
c++ - lambda 的速度与内联函数
我有 lambda 函数的速度问题。这是代码:
该for_each_lit
函数的签名是:
该函数lit_diff_watches
运行数百万次,以 3.3s 为例。但是,当我取消注释开关并注释掉for_each_line
(这是开关的复制粘贴)时,我得到 1.7 秒的相同运行时间。请注意,99% 的时间watch_binary_t
或发生,即每个函数调用watch_tertiary_t
只应执行很少的指令。lit_diff_watches
你能告诉我我做错了什么吗?GCC 4.7 和当前的 llvm-svn(2013 年 11 月 25 日)的行为相同,时间差异很小。我猜函数调用不是内联的,但我不是专家。我想修复这个问题,因为这switch(..){..}
在代码中的很多地方,并且使用 lambdas &for_each_lit
会显着清理代码。但是,我不能为此失去这么多的速度。10-20% 就可以了,但几乎 2 倍的减速就太多了。
gcc - 内联一个简单的汇编函数
我(试图)遵循一个旧答案,但我一定做错了什么:该函数没有内联(它仍然在反汇编中被调用)。这是我所做的:
get_regs.h:
inline unsigned long __get_esp(void) {
__asm__("movl %esp,%eax");
}
程序.c:
...
#include "get_regs.h "
...
extern unsigned long __get_esp(void);
...
tmp = __get_esp();
编译为(出于各种原因的其他选项):
gcc -g -fno-stack-protector -mpreferred-stack-boundary=2 program.c
这遵循第二条建议,将定义包含在头文件中。
我意识到我可以使用扩展程序集并将结果从%eax
to复制tmp
,但想了解进行内联。我在 SO 上找到了一些热门,但似乎没有一个能涵盖我的情况。
系统:
- Ubuntu 12.04
- gcc 4.6.3。
- x86 32 位
c++ - 为什么使用内联函数的程序根据链接顺序和参数有不同的行为?
我知道这个问题的答案,但我们可以从中获得一些乐趣来分析它。我们将学会玩得开心!
我在这些测试中使用了 gcc 4.1.2。
首先,这段代码不是标准的,因为一个内联函数在不同的翻译单元中会有不同的定义。我知道。但是让我们分析一下发生了什么,并回答我将提出的三个问题。我们会从中学习:)
我将保持文件简单(例如,没有#ifndef 保护)。
假设我有这些文件:
增量.h:
递减.h:
递减.cpp:
主.cpp:
如果我用这个 Makefile 编译它们:
输出是:
如果我从 Makefile 中删除 -O2 标志:
输出是:
如果我还更改了 main.o 和 decrement.o 的顺序(就像我刚才所做的那样,让它没有 -O2 标志):
结果是:
这里发生了什么?为什么 -O2 标志和目标文件链接的顺序会以这种方式改变输出?
java - HotSpot VM 内联方法的条件
我正在阅读 HotSpot VM 应用的优化技术,并找到了 Oracle 的这个演示文稿,其中列出了 HotSpot VM 尝试内联方法调用时的三个可能条件:
- 去虚拟化(证明只有一种目标方法)
- 单态内联缓存
- 配置文件驱动的内联缓存
通过搜索互联网,我相信我理解这意味着以下内容:
VM“证明”一个类型当前没有子类型。因此,可以将虚拟方法调用转换为允许内联方法代码的非虚拟方法调用。添加了一个保护条件,用于检查执行内联后没有加载任何子类型。
观察到方法总是在特定调用站点的单一类型上调用。(额外的问题:Java 是否支持多态内联缓存?)这允许执行乐观内联,其中保护条件检查类型是否不是缓存中表示的类型。
我不知道那是什么。
我的问题是:内联方法调用还有其他主要原因吗?我的研究正确吗?什么是配置文件驱动的内联缓存?