Questions tagged «optimization»

优化是改进方法或设计的行为。在编程中,优化通常采取提高算法速度或减少所需资源的形式。优化的另一个含义是机器学习中使用的数值优化算法。

6
如何为MySQL表添加索引?
我有一个非常大的MySQL表,其中包含约15万行数据。目前,当我尝试运行 SELECT * FROM table WHERE id = '1'; 该代码运行良好,因为ID字段是主要索引。但是,对于该项目的最新开发,我必须按另一个字段搜索数据库。例如: SELECT * FROM table WHERE product_id = '1'; 该字段先前未编制索引;但是,我添加了一个,因此mysql现在为该字段建立索引,但是当我尝试运行上述查询时,它运行非常缓慢。一个EXPLAIN查询显示,当我已经添加了product_id字段时,没有针对product_id字段的索引,因此该查询需要20分钟到30分钟的任何时间才能返回单行。 我完整的EXPLAIN结果是: | id | select_type | table | type | possible_keys| key | key_len | ref | rows | Extra | +----+-------------+-------+------+--------------+------+---------+------+-------+------------------+ | 1 | SIMPLE | table | ALL | …


20
导入语句是否应该始终位于模块的顶部?
PEP 08指出: 导入总是放在文件的顶部,紧随任何模块注释和文档字符串之后,以及模块全局变量和常量之前。 但是,如果仅在极少数情况下使用我要导入的类/方法/函数,那么在需要时进行导入肯定会更有效吗? 这不是吗? class SomeClass(object): def not_often_called(self) from datetime import datetime self.datetime = datetime.now() 比这更有效? from datetime import datetime class SomeClass(object): def not_often_called(self) self.datetime = datetime.now()

24
最快的固定长度6 int数组
在回答另一个堆栈溢出问题(这个问题)时,我偶然发现了一个有趣的子问题。对6个整数数组进行排序的最快方法是什么? 由于问题非常低: 我们不能假设库可用(并且调用本身有成本),只能使用普通C语言 为了避免排空指令流水线(具有非常高的成本),我们也许应该尽量减少分支机构,跳跃,和所有其他类型的控制流断裂(像那些隐藏在背后的序列点&&或||)。 房间受到限制,尽量减少寄存器和内存使用是一个问题,理想情况下,最好在适当的位置进行排序。 确实,这个问题是一种高尔夫,其目标不是最小化源代码长度,而是执行时间。我将其称为“ Zening”代码,如Michael Abrash所著的《Zen of Code Optimization》及其续集的书名中所用。 至于为什么有趣,它分为几层: 该示例简单易懂,易于度量,不涉及太多C技能 它显示了针对该问题选择良好算法的效果,还显示了编译器和基础硬件的效果。 这是我的参考(天真,未优化)实现和测试集。 #include <stdio.h> static __inline__ int sort6(int * d){ char j, i, imin; int tmp; for (j = 0 ; j < 5 ; j++){ imin = j; for (i = j + 1; i < …


29
用Java增加Map值的最有效方法
我希望这个问题对于本论坛来说不是太基本了,但是我们会看到的。我想知道如何重构一些代码以获得更好的性能,而这些性能已经运行了很多次。 假设我正在使用地图(可能是HashMap)创建一个单词频率列表,其中每个键是一个带有要计算单词的String,值是一个Integer,每次找到该单词的标记时都会增加。 在Perl中,增加这样的值非常容易: $map{$word}++; 但是在Java中,它要复杂得多。这是我目前的操作方式: int count = map.containsKey(word) ? map.get(word) : 0; map.put(word, count + 1); 当然,哪个依赖于较新的Java版本中的自动装箱功能。我想知道您是否可以建议一种更有效的递增此值的方法。避开Collections框架并改用其他东西,甚至有良好的性能原因吗? 更新:我已经测试了几个答案。见下文。

7
在2D数组上进行迭代时,为什么循环顺序会影响性能?
下面是两个几乎完全相同的程序,除了我切换了i和j变量。它们都以不同的时间运行。有人可以解释为什么会这样吗? 版本1 #include <stdio.h> #include <stdlib.h> main () { int i,j; static int x[4000][4000]; for (i = 0; i < 4000; i++) { for (j = 0; j < 4000; j++) { x[j][i] = i + j; } } } 版本2 #include <stdio.h> #include <stdlib.h> main () { int i,j; …

30
列出N以下所有素数的最快方法
这是我能想到的最好的算法。 def get_primes(n): numbers = set(range(n, 1, -1)) primes = [] while numbers: p = numbers.pop() primes.append(p) numbers.difference_update(set(range(p*2, n+1, p))) return primes >>> timeit.Timer(stmt='get_primes.get_primes(1000000)', setup='import get_primes').timeit(1) 1.1499958793645562 可以使它更快吗? 此代码有一个缺陷:由于numbers是无序集合,因此不能保证numbers.pop()从集合中删除最低的数字。但是,它对某些输入数字有效(至少对我而言): >>> sum(get_primes(2000000)) 142913828922L #That's the correct sum of all numbers below 2 million >>> 529 in get_primes(1000) False >>> 529 in …

4
在英特尔Sandybridge系列CPU中取消对管道程序的优化
我已经花了一个星期的时间来尝试完成这项任务,我希望这里的人可以带领我走上正确的道路。让我从讲师的指示开始: 您的分配与我们的第一个实验分配相反,后者是优化素数程序。您在此作业中的目的是简化程序,即使其运行缓慢。这两个都是占用大量CPU的程序。他们需要几秒钟才能在我们的实验室PC上运行。您可能无法更改算法。 要优化程序,请使用有关Intel i7管道运行方式的知识。想像一下重新排序指令路径以引入WAR,RAW和其他危险的方法。想办法最大限度地减少缓存的有效性。令人作呕的无能。 作业中选择了磨刀石或蒙特卡洛程序。缓存效率注释大部分仅适用于Whetstone,但我选择了蒙特卡洛模拟程序: // Un-modified baseline for pessimization, as given in the assignment #include <algorithm> // Needed for the "max" function #include <cmath> #include <iostream> // A simple implementation of the Box-Muller algorithm, used to generate // gaussian random numbers - necessary for the Monte Carlo method below …


5
如何查看哪些插件使Vim变慢?
有没有一种配置Vim插件的方法? 当我打开大盘时,我的MacVim变得越来越慢.py。我知道我可以取消选择所有插件,然后一个一个地重新选择,以检查哪个插件是罪魁祸首,但是有没有更快的方法? 我的dotvim在这里:https : //github.com/charlax/dotvim


8
为什么要快速运行glibc的复杂性太复杂?
我在这里浏览strlen代码,想知道是否确实需要代码中使用的优化?例如,为什么下面这样的东西不能同样好或更好? unsigned long strlen(char s[]) { unsigned long i; for (i = 0; s[i] != '\0'; i++) continue; return i; } 较简单的代码对编译器进行优化是否更好或更容易? strlen链接后面页面上的代码如下所示: /* Copyright (C) 1991, 1993, 1997, 2000, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Torbjorn Granlund (tege@sics.se), with …


4
从前,当>快于<…时,等等?
我正在阅读一个很棒的OpenGL教程。真的很好,相信我。我当前所在的主题是Z缓冲区。除了解释全部内容之外,作者还提到我们可以执行自定义深度测试,例如GL_LESS,GL_ALWAYS等。他还解释了深度值的实际含义(最高和最低)也可以是定制。到目前为止我还了解。然后作者说了一些难以置信的话: zNear范围可以大于zFar范围;如果是这样,那么就构成距观看者最近或最远的位置而言,窗口空间值将反转。 此前,有人说窗口空间Z值0最接近,而1最远。但是,如果我们的剪辑空间Z值被取反,则深度1将最接近视图,深度0将最远。但是,如果翻转深度测试的方向(GL_LESS到GL_GREATER等),我们将得到完全相同的结果。因此,这实际上只是一个约定。确实,翻转Z的符号和深度测试曾经是许多游戏中至关重要的性能优化。 如果我正确理解,从性能角度来看,翻转Z的符号和深度测试仅是将&lt;比较更改为比较而已&gt;。因此,如果我理解正确,而作者并没有在撒谎或编造东西,那么更改&lt;为&gt;过去对于许多游戏来说都是至关重要的优化。 作者是在编造东西吗,我是在误解某些东西,还是真的曾经比&lt;他慢(如作者所说,生命至关重要)&gt;? 感谢您澄清这个非常奇怪的问题! 免责声明:我完全知道算法复杂性是优化的主要来源。此外,我怀疑现在绝对不会有任何改变,我不是要优化它。我只是极度,痛苦,甚至是好奇。
280 c  optimization  opengl  cpu  gpu 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.