Questions tagged «optimization»

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

12
使用匿名函数会影响性能吗?
我一直想知道,在Javascript中使用命名函数和匿名函数之间是否存在性能差异? for (var i = 0; i < 1000; ++i) { myObjects[i].onMyEvent = function() { // do something }; } 与 function myEventHandler() { // do something } for (var i = 0; i < 1000; ++i) { myObjects[i].onMyEvent = myEventHandler; } 第一个是比较整洁的,因为它不会因很少使用的函数而使您的代码混乱,但是多次重声明该函数是否重要呢?

1
为什么此Haskell代码在-O下运行速度较慢?
这件作品的Haskell代码运行多速度较慢-O,但-O应无危险。谁能告诉我发生了什么事?如果很重要,则尝试解决此问题,并使用二进制搜索和持久性段树: import Control.Monad import Data.Array data Node = Leaf Int -- value | Branch Int Node Node -- sum, left child, right child type NodeArray = Array Int Node -- create an empty node with range [l, r) create :: Int -> Int -> Node create l r | l …

4
Haskell是否具有尾递归优化?
我今天在Unix中发现了“ time”命令,以为我会用它来检查Haskell的尾递归函数与普通递归函数之间的运行时差异。 我编写了以下函数: --tail recursive fac :: (Integral a) => a -> a fac x = fac' x 1 where fac' 1 y = y fac' x y = fac' (x-1) (x*y) --normal recursive facSlow :: (Integral a) => a -> a facSlow 1 = 1 facSlow x = x …

9
是否查看并清除Postgres缓存/缓冲区?
有时我运行一个Postgres查询需要30秒。然后,我立即运行相同的查询,这需要2秒钟。看来Postgres具有某种缓存。我能以某种方式查看该缓存保存了什么吗?我可以强制清除所有缓存以进行调整吗? 注意:我基本上是在寻找以下SQL Server命令的postgres版本: DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS 但我也想知道如何查看该缓冲区中实际包含的内容。 谢谢你的帮助。



8
为什么运算符比方法调用慢得多?(仅在较旧的JIT上结构较慢)
简介: 我用C#编写高性能的代码。是的,我知道C ++可以为我提供更好的优化,但是我仍然选择使用C#。我不想辩论这种选择。相反,我想听听那些像我一样试图在.NET Framework上编写高性能代码的人。 问题: 为什么下面代码中的运算符比等效方法调用慢? 为什么在下面的代码中传递两个双精度值的方法比在内部传递两个双精度值的结构的等效方法更快?(A:较旧的JIT对结构的优化效果很差) 是否有办法让.NET JIT编译器将简单结构与结构成员一样有效?(A:获取更新的JIT) 我想知道的是: 原始的.NET JIT编译器不会内联任何涉及结构的内容。给定的奇异结构仅应在需要小值类型(如内置)进行优化但适用的情况下使用。幸运的是,在.NET 3.5SP1和.NET 2.0SP2中,他们对JIT Optimizer进行了一些改进,包括对内联的改进,尤其是对结构的改进。(我猜他们是这样做的,因为否则,他们引入的新Complex结构会表现得很糟糕……因此Complex团队可能正在对JIT Optimizer团队加紧努力。)因此,.NET 3.5 SP1之前的任何文档都可能与这个问题不太相关。 我的测试显示: 通过检查C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorwks.dll文件确实具有版本> = 3053,我已验证自己具有更新的JIT Optimizer,因此应该进行这些改进到JIT优化器。但是,尽管如此,我的时间安排和对拆卸的观察都显示了: JIT生成的用于传递具有两个双精度的结构的代码的效率远远低于直接传递两个双精度的代码的效率。 JIT生成的用于struct方法的代码比通过struct作为参数传递“ this”的效率要高得多。 如果传递两个双精度值而不是传递具有两个双精度值的结构,即使使用乘数(由于明显处于循环状态),JIT仍会更好地内联。 时间: 实际上,看一下反汇编,我意识到循环中的大多数时间只是从列表中访问测试数据。如果不考虑循环和数据访问的开销代码,则进行相同调用的四种方式之间的差异将大大不同。对于PlusEqual(double,double)而不是PlusEqual(Element),我得到5倍到20倍的提速。10倍到40倍用于执行PlusEqual(double,double)而不是运算符+ =。哇。伤心。 这是一组时间: Populating List<Element> took 320ms. The PlusEqual() method took 105ms. The …

8
为什么GDB会在行与行之间意外地跳转并将变量打印为“ <值优化输出>”?
谁能解释gdb的这种行为? 900 memset(&amp;new_ckpt_info,'\0',sizeof(CKPT_INFO)); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_** HDR),i_offset); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_ HDR),i_offset);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 …

11
饱和减/加无符号字节
假设我有两个无符号字节b和x。我需要计算bsubasb - x和baddas b + x。但是,我不希望在这些操作期间发生下溢/上溢。例如(伪代码): b = 3; x = 5; bsub = b - x; // bsub must be 0, not 254 和 b = 250; x = 10; badd = b + x; // badd must be 255, not 4 这样做的明显方法包括分支: bsub = b - min(b, x); …

3
将通过最大似然估计的系数获取到寻星表中
Stargazer为lm(和其他)物体产生非常漂亮的乳胶表。假设我已经以最大可能性拟合了模型。我希望观星者为我的估算出一张类似lm的桌子。我怎样才能做到这一点? 尽管有点麻烦,但是一种方法可能是创建一个包含我的估算值的“伪” lm对象-我认为,只要summary(my.fake.lm.object)有效,它就可以工作。这容易做到吗? 一个例子: library(stargazer) N &lt;- 200 df &lt;- data.frame(x=runif(N, 0, 50)) df$y &lt;- 10 + 2 * df$x + 4 * rt(N, 4) # True params plot(df$x, df$y) model1 &lt;- lm(y ~ x, data=df) stargazer(model1, title="A Model") # I'd like to produce a similar table for the model …
83 r  optimization  lm  stargazer 

9
什么时候不是使用python生成器的好时机?
这与您可以使用Python生成器函数做什么相反呢?:python生成器,生成器表达式和itertools模块是这些天我最喜欢的python功能。当设置操作链以对大量数据执行时,它们特别有用-我在处理DSV文件时经常使用它们。 那么什么时候不是使用生成器,生成器表达式或itertools函数的好时机? 我什么时候应该更喜欢zip()了itertools.izip(),或者 range()在xrange()或 [x for x in foo]结束了(x for x in foo)? 显然,我们最终需要通常通过创建列表或使用非生成器循环对其进行迭代来将生成器“解析”为实际数据。有时我们只需要知道长度即可。这不是我要的 我们使用生成器,以便我们不会将新列表分配到内存中以存储临时数据。这对于大型数据集尤其有意义。小型数据集也有意义吗?是否存在明显的内存/ CPU权衡? 考虑到列表理解性能与map()和filter()的令人大开眼界的讨论,如果有人对此进行了分析,我尤其感兴趣。(alt链接)

20
优化何时过早?
正如克努斯所说, 我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源。 这是Stack Overflow经常回答诸如“哪种是最有效的循环机制”,“ SQL优化技术”之类的问题。(依此类推)。这些优化技巧问题的标准答案是分析您的代码,首先查看是否有问题,如果不是,那么就不需要您的新技术了。 我的问题是,如果特定技术有所不同,但不是特别晦涩难懂,那真的可以认为是过早的优化吗? 这是Randall Hyde的相关文章,称为《过早优化的谬误》。


7
从Java字符串中剥离所有不可打印字符的最快方法
String用Java剥离所有不可打印字符的最快方法是什么? 到目前为止,我已经尝试并测量了138字节,131个字符的字符串: 字符串的replaceAll()-最慢的方法 517009个结果/秒 预编译模式,然后使用Matcher的 replaceAll() 637836个结果/秒 使用StringBuffer,使用codepointAt()一对一获取代码点并追加到StringBuffer 711946结果/秒 使用StringBuffer,使用charAt()一对一获取字符并追加到StringBuffer 1052964结果/秒 预分配char[]缓冲区,使用charAt()一对一获取字符并填充该缓冲区,然后转换回String 2022653个结果/秒 预分配2个char[]缓冲区-旧的和新的,使用一次获取现有String的所有字符,一次又一次getChars()遍历旧缓冲区并填充新缓冲区,然后将新缓冲区转换为String-我自己最快的版本 2502502结果/秒 具有2个缓冲区的相同内容-仅使用byte[],getBytes()并将编码指定为“ utf-8” 857485结果/秒 具有2个byte[]缓冲区的相同内容,但将编码指定为常量Charset.forName("utf-8") 791076个结果/秒 具有2个byte[]缓冲区的相同内容,但是将编码指定为1字节本地编码(几乎没有理智的事情) 370164结果/秒 我的最佳尝试是: char[] oldChars = new char[s.length()]; s.getChars(0, s.length(), oldChars, 0); char[] newChars = new char[s.length()]; int newLen = 0; for (int j = 0; j &lt; s.length(); j++) …

4
“性能统计”结果中的停滞周期前端和停滞周期后端是什么?
有人知道perf stat结果中的stalled -cycles-frontend和stalled-cycles-backend是什么意思吗?我在互联网上搜索,但没有找到答案。谢谢 $ sudo perf stat ls Performance counter stats for 'ls': 0.602144 task-clock # 0.762 CPUs utilized 0 context-switches # 0.000 K/sec 0 CPU-migrations # 0.000 K/sec 236 page-faults # 0.392 M/sec 768956 cycles # 1.277 GHz 962999 stalled-cycles-frontend # 125.23% frontend cycles idle 634360 stalled-cycles-backend # 82.50% …

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.