问题标签 [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.

0 投票
2 回答
4210 浏览

postgresql - 如何防止 Postgres 内联子查询?

这是 Postgres 9.1.6 上的慢查询,即使最大计数为 2,两行都已由它们的主键标识:(4.5 秒)

嗯,也许如果我首先只使用主键部分进行子查询......:(不,仍然是 4.5+ 秒)

如何防止 Postgres 内联子查询?

背景:我有一个使用hstore并带有GiST 索引的 Postgres 9.1 表。

0 投票
4 回答
789 浏览

php - 他们说 HTML 中的 javascript 代码被认为是不好的做法,如何解决这个问题?

因此,我知道将 javascript 混合到 HTML 中是不好的,即使在头脑中也是如此。但是让我们看看这段代码(我想从列表中删除项目)

此列表由 PHP 生成。deleteThisItemById() 位于外部.js文件中。这仍然被认为是坏事吗?如果是这样,规范的解决方案是什么?jQuery 是可以接受的,原始的 javascript 也是如此。

0 投票
1 回答
1556 浏览

gnuplot - 没有文本文件的 Gnuplotting 多图数据

我刚刚阅读了没有 textfile 的 Gnuplotting 数据,我想做同样的事情,但使用“多图”。我目前有:

我想将数据内联到data.csv.

0 投票
1 回答
1083 浏览

c# - C# 优化器性能不佳?

我刚刚写了一个小例子来检查 C# 的优化器在索引器的情况下如何表现。这个例子很简单——我只是将一个数组包装在一个类中并尝试填充它的值:一次直接,一次通过索引器(它在内部访问数据的方式与直接解决方案完全相同)。

许多 SO 帖子告诉我,程序员应该高度信任优化器来完成它的工作。但在这种情况下,结果非常令人惊讶:

(在发布配置中编译并进行了优化,我仔细检查了)。

这是一个巨大的差异 - 绝不是统计错误(它既可扩展又可重复)。

这是一个非常令人不快的惊喜:在这种情况下,我希望编译器内联索引器(它甚至不包括任何范围检查),但它没有这样做。这是反汇编(注意,我的评论是对正在发生的事情的猜测):

直接的

通过索引器

这完全是一场灾难(就代码优化而言)。所以我的问题是:

  • 为什么这段代码(实际上很简单)没有得到适当的优化?
  • 如何修改此代码,使其按我想要的方式进行优化(如果可能)?
  • 程序员能否像依赖 C++ 的优化器一样依赖 C# 的优化器?

好的,我知道,最后一个很难回答。但是最近我读到了很多关于 C++ 性能的问题,并且对优化器能做多少感到惊讶(例如,完全内联std::tie、两个std::tuplector 和动态重载opeartor <)。


编辑:(回应评论)

看来,这实际上仍然是我的错,因为我在运行 IDE时检查了性能。现在,我从 IDE 中运行了相同的程序,并通过即时调试器附加到它。现在我得到:

直接的

索引器

这些代码完全相同(就 CPU 指令而言)。运行后,索引器版本比直接版本获得了更好的结果,但只是(我猜)因为缓存。将测试放入循环后,一切恢复正常:

出色地; 学过的知识。即使在 Release 模式下编译,程序是在 IDE 中运行还是在 Standalone 中运行都有很大的不同。感谢@harold 的想法。

0 投票
1 回答
135 浏览

c# - JIT 内联私有字段会从另一个类访问吗?

我有一些属性用于访问父类中的字段,如下所示:

A类:

B 类:A:

我的问题是,如果我访问B.Number,它是否仍会解析为直接访问A._number(+1)?

当然,这是假设一个优化的发布版本。

更重要的是,访问修饰符是抽象的(因为它们仅在编译时很重要,并且在运行时对代码没有影响),还是它们实际上会在运行时限制访问(当然,使用反射时除外)?

0 投票
4 回答
1139 浏览

c++ - gcc 多重定义...仅发布

我在头文件中定义了一个函数。在调试中,它可以很好地编译和链接。在发行版中,对于包含标头的每个类的每个目标文件,我都会收到编译错误“`blah::blah(blah& blah)' 的多重定义”。

我正在使用 gcc-4.8.1。我无法发布实际代码,这个版本已更改名称以保护无辜者:

我一直无法找到哪个 gcc 标志负责。当然,修复只是将实现移动到 cpp 文件中。但为什么这是必要的?为什么这只会在发布时发生?

0 投票
1 回答
782 浏览

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 倍的减速就太多了。

0 投票
1 回答
109 浏览

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

这遵循第二条建议,将定义包含在头文件中。

我意识到我可以使用扩展程序集并将结果从%eaxto复制tmp,但想了解进行内联。我在 SO 上找到了一些热门,但似乎没有一个能涵盖我的情况。

系统:
- Ubuntu 12.04
- gcc 4.6.3。
- x86 32 位

0 投票
1 回答
101 浏览

c++ - 为什么使用内联函数的程序根据链接顺序和参数有不同的行为?

我知道这个问题的答案,但我们可以从中获得一些乐趣来分析它。我们将学会玩得开心!

我在这些测试中使用了 gcc 4.1.2。

首先,这段代码不是标准的,因为一个内联函数在不同的翻译单元中会有不同的定义。我知道。但是让我们分析一下发生了什么,并回答我将提出的三个问题。我们会从中学习:)

我将保持文件简单(例如,没有#ifndef 保护)。

假设我有这些文件:

增量.h

递减.h

递减.cpp

主.cpp

如果我用这个 Makefile 编译它们:

输出是:

如果我从 Makefile 中删除 -O2 标志:

输出是:

如果我还更改了 main.o 和 decrement.o 的顺序(就像我刚才所做的那样,让它没有 -O2 标志):

结果是:

这里发生了什么?为什么 -O2 标志和目标文件链接的顺序会以这种方式改变输出?

0 投票
1 回答
882 浏览

java - HotSpot VM 内联方法的条件

我正在阅读 HotSpot VM 应用的优化技术,并找到了 Oracle 的这个演示文稿,其中列出了 HotSpot VM 尝试内联方法调用时的三个可能条件:

  1. 去虚拟化(证明只有一种目标方法)
  2. 单态内联缓存
  3. 配置文件驱动的内联缓存

通过搜索互联网,我相信我理解这意味着以下内容:

  1. VM“证明”一个类型当前没有子类型。因此,可以将虚拟方法调用转换为允许内联方法代码的非虚拟方法调用。添加了一个保护条件,用于检查执行内联后没有加载任何子类型。

  2. 观察到方法总是在特定调用站点的单一类型上调用。(额外的问题:Java 是否支持多态内联缓存?)这允许执行乐观内联,其中保护条件检查类型是否不是缓存中表示的类型。

  3. 我不知道那是什么。

我的问题是:内联方法调用还有其他主要原因吗?我的研究正确吗?什么是配置文件驱动的内联缓存