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

0 投票
8 回答
2228 浏览

sql - 表扫描与添加索引 - 哪个更快?

我有一张有数百万行的表。我需要找到具有特定列值的所有行。该列不在索引中,因此会导致表扫描。

但是在头部添加一个索引(主键跟随),执行查询,然后删除索引会更快吗?

我无法永久添加索引,因为用户正在指定他们正在寻找的列。

0 投票
5 回答
47329 浏览

c++ - 哪些 C++ 编译器(如果有)进行尾递归优化?

在我看来,在 C 和 C++ 中进行尾递归优化会非常好,但是在调试时,我似乎从来没有看到表明这种优化的帧堆栈。这很好,因为堆栈告诉我递归有多深。但是,优化也会很好。

是否有任何 C++ 编译器进行此优化?为什么?为什么不?

我该如何告诉编译器这样做?

  • 对于 MSVC:/O2/Ox
  • 对于 GCC:-O2-O3

在某种情况下检查编译器是否已经这样做了如何?

  • 对于 MSVC,启用 PDB 输出以能够跟踪代码,然后检查代码
  • 对于海湾合作委员会..?

我仍然会就如何确定编译器是否像这样优化某个函数提出建议(尽管我发现康拉德告诉我假设它令人放心)

总是可以通过进行无限递归并检查它是否导致无限循环或堆栈溢出来检查编译器是否完全执行此操作(我使用 GCC 执行此操作并发现这就-O2足够了),但我想成为能够检查我知道无论如何都会终止的某个功能。我很想有一个简单的方法来检查这个:)


经过一些测试,我发现析构函数破坏了进行这种优化的可能性。有时值得更改某些变量和临时变量的范围,以确保它们在返回语句开始之前超出范围。

如果在尾调用之后需要运行任何析构函数,则无法进行尾调用优化。

0 投票
6 回答
9463 浏览

sql-server - SQL Server - Does column order matter?

In terms of performance and optimizations:

  • When constructing a table in SQL Server, does it matter what order I put the columns in?
  • Does it matter if my primary key is the first column?
  • When constructing a multi-field index, does it matter if the columns are adjacent?
  • Using ALTER TABLE syntax, is it possible to specify in what position I want to add a column?
    • If not, how can I move a column to a difference position?
0 投票
4 回答
364 浏览

algorithm - 跟踪字符串中特定字符索引的最有效方法是什么?

以下面的字符串为例:

“敏捷的棕色狐狸”

现在 quick 中的 q 位于字符串的索引 4 处(从 0 开始),而 fox 中的 f 位于索引 16 处。现在假设用户在该字符串中输入了更多文本。

“速度极快的深褐色狐狸”

现在 q 在索引 9 处, f 在索引 26 处。

无论用户添加多少个字符,在 quick 和 fox 中跟踪原始 q 的索引的最有效方法是什么?

语言对我来说无关紧要,这更像是一个理论问题,所以使用任何你想要的语言,尽量让它保持普遍流行和当前的语言。

我给出的示例字符串很短,但我希望有一种方法可以有效地处理任何大小的字符串。因此,使用偏移量更新数组将适用于短字符串,但会因许多字符而陷入困境。

即使在示例中我正在寻找字符串中唯一字符的索引,我也希望能够在不同位置跟踪相同字符的索引,例如棕色的 o 和狐狸的 o。所以搜索是不可能的。

我希望答案既节省时间又节省内存,但如果我必须选择一个,我更关心性能速度。

0 投票
7 回答
9155 浏览

sql - PostgreSQL 性能监控工具

我正在设置一个带有 FreeBSD PostgreSQL 后端的 Web 应用程序。我正在寻找一些数据库性能优化工具/技术。

0 投票
5 回答
2669 浏览

c# - 将指针数组固定在内存中

我目前正在将 C# 中的光线追踪器作为一个爱好项目。我试图通过从 c++ 实现中实现一些技巧来实现不错的渲染速度,但遇到了麻烦。

光线追踪器渲染的场景中的对象存储在 KdTree 结构中,而树的节点又存储在数组中。我遇到问题的优化是在尝试将尽可能多的树节点放入缓存行时。这样做的一种方法是让节点只包含指向左子节点的指针。然后隐含的是,右孩子紧跟在数组中的左孩子之后。

节点是结构,在树构造期间,它们被静态内存管理器类成功放入数组中。当我开始遍历树时,起初它似乎工作得很好。然后在渲染早期的某个点(每次大约在同一个地方),根节点的左子指针突然指向一个空指针。我得出的结论是,当数组位于堆上时,垃圾收集器已经移动了结构。

我已经尝试了几种方法来将地址固定在内存中,但它们似乎都不能像我需要的那样持续整个应用程序的生命周期。'fixed' 关键字似乎只在单个方法调用期间有帮助,并且声明 'fixed' 数组只能在节点不是的简单类型上完成。有没有一个好的方法可以做到这一点,或者我只是在 C# 不适合的东西的道路上走得太远了。

顺便说一句,改用 c++ 虽然可能是高性能程序的更好选择,但不是一种选择。

0 投票
7 回答
1892 浏览

java - 如何从第三方库中去除绒毛?

这可能不是最佳实践,但有办法从第三方的 jar 文件中删除未使用的类。查看我的类使用库的方式并进行某种覆盖分析,然后吐出另一个 jar 并删除了所有未触及的类。

显然这有问题。具体来说,我提出的使用场景可能不会一直使用所有类。

但是忽略这些问题,原则上能做到吗?

0 投票
12 回答
903058 浏览

html - 如何在 HTML 中将一张图片放在另一张图片之上?

我是 Rails 编程的初学者,试图在页面上显示许多图像。有些图像要放在其他图像之上。为了简单起见,假设我想要一个蓝色方块,蓝色方块的右上角有一个红色方块(但角落不紧)。由于性能问题,我试图避免合成(使用 ImageMagick 等)。

我只想相对于彼此定位重叠的图像。

作为一个更困难的例子,想象一个里程表放置在一个更大的图像中。对于六位数字,我需要合成一百万个不同的图像,或者在运行中完成所有操作,所需要的只是将六个图像放在另一个图像之上。

0 投票
3 回答
1974 浏览

linq - 优化 LINQ to SQL 查询

我有一个看起来像这样的查询:

我需要打印订单信息和创建它的用户:

这将生成一个 SQL 查询来带来订单,并为每个订单生成一个查询来带来客户。是否可以优化查询,以便在一个 SQL 查询中带来订单和客户?

谢谢

UDPATE:根据 Sirrocco 的建议,我更改了这样的查询并且它有效。只生成一个选择查询:

谢谢西洛克。

0 投票
10 回答
6590 浏览

python - 为什么 SQL 聚合函数比 Python 和 Java(或可怜人的 OLAP)慢得多

我需要一个真正的 DBA 的意见。Postgres 8.3 在我的 Macbook Pro 上执行此查询需要 200 毫秒,而 Java 和 Python 在 20 毫秒(350,000 行)内执行相同的计算:

这是使用 SQL 数据库时的正常行为吗?

架构(该表包含对调查的回复):

我在 Java 和 Python 中为上下文编写了一些测试,它们粉碎了 SQL(纯 python 除外):

即使 sqlite3 与 Postgres 竞争,尽管它假设所有列都是字符串(相比之下:即使在 Postgres 中仅使用切换到数字列而不是整数也会导致 10 倍的减速)

我尝试过但没有成功的调整包括(盲目地遵循一些网络建议):

所以我的问题是,我在这里的体验是否正常,这就是我在使用 SQL 数据库时可以期待的吗?我可以理解 ACID 必须付出代价,但在我看来这有点疯狂。我不是要求实时游戏速度,但由于 Java 可以在 20 毫秒内处理数百万次双打,我感到有点嫉妒。

有没有更好的方法以便宜的方式进行简单的 OLAP(无论是在资金方面还是在服务器复杂性方面)?我研究过 Mondrian 和 Pig + Hadoop,但对维护另一个服务器应用程序并不太兴奋,也不确定它们是否会有所帮助。


没有 Python 代码和 Java 代码可以说是在内部完成所有工作。我只生成了 4 个数组,每个数组有 350,000 个随机值,然后取平均值。我不包括时间中的生成,只包括平均步骤。java 线程计时使用 4 个线程(每个数组平均一个),过大但绝对是最快的。

sqlite3 计时由 Python 程序驱动,并从磁盘运行(不是:内存:)

我意识到 Postgres 在幕后做了更多工作,但大部分工作对我来说并不重要,因为这是只读数据。

Postgres 查询不会更改后续运行的时间。

我重新运行了 Python 测试,包括将其从磁盘中脱机。时间大大减慢到近 4 秒。但我猜 Python 的文件处理代码几乎是用 C 语言编写的(尽管可能不是 csv lib?)所以这向我表明 Postgres 也没有从磁盘流式传输(或者你是正确的,我应该低头在谁写了他们的存储层之前!)