假设我们正在尝试使用tsc进行性能监视,并且我们希望阻止指令重新sorting。 这些是我们的select: 1: rdtscp是一个序列化调用。 它阻止了对rdtscp调用的重新sorting。 __asm__ __volatile__("rdtscp; " // serializing read of tsc "shl $32,%%rdx; " // shift higher 32 bits stored in rdx up "or %%rdx,%%rax" // and or onto rax : "=a"(tsc) // output to tsc variable : : "%rcx", "%rdx"); // rcx and rdx are clobbered 但是, rdtscp仅适用于较新的CPU。 所以在这种情况下,我们必须使用rdtsc 。 但rdtsc是非序列化的,所以单独使用它不会阻止CPU对其进行重新sorting。 所以我们可以使用这两个选项来防止重新sorting: […]
我只是比较斯卡拉演员与Java线程的performance。 我惊异地看到了差异,我观察到,在我的系统中,我能够产生最多2000线程(一次只能生活)。但是使用同一个系统,我能够产生大约50万个scala的演员。 这两个程序都使用了大约81MB的JVM堆内存。 你能解释一下java线程是如何比scala / akka actor更重吗? 什么是使scala-actor这么重量轻的关键因素? 如果我想获得最佳的可伸缩性,我应该去基于演员的Web服务器,而不是基于Java的传统的Web /应用服务器,如JBoss或Tomcat? 谢谢。
我正在把David Blei的C潜在Dirichlet分配的C实现移植到Haskell中,我正在试着决定是否在C中留下一些低级的东西。下面的函数就是一个例子 – 它是一个近似值的二阶导数: double trigamma(double x) { double p; int i; x=x+6; p=1/(x*x); p=(((((0.075757575757576*p-0.033333333333333)*p+0.0238095238095238) *p-0.033333333333333)*p+0.166666666666667)*p+1)/x+0.5*p; for (i=0; i<6 ;i++) { x=x-1; p=1/(x*x)+p; } return(p); } 我已经把它翻译成或多或less俗语的Haskell,如下所示: trigamma :: Double -> Double trigamma x = snd $ last $ take 7 $ iterate next (x' – 1, p') where x' = x + 6 p […]
对于小型数组,Java的System.arraycopy()效率如何,或者它是一个本地方法,这使得它可能比一个简单的循环和一个函数调用效率低得多? 本地方法是否会导致跨越某种Java系统桥的额外性能开销?
考虑下一个代码: unsigned idx; //.. some work with idx if( idx >= idx_max ) idx %= idx_max; 可以简化为只有第二行: idx %= idx_max; 并会取得相同的结果。 有几次我遇到了下一个代码: unsigned x; //… some work with x if( x!=0 ) x=0; 可以简化为 x=0; 问题: 有没有任何意义, if和为什么? 尤其是使用ARM Thumb指令集。 难道这些if被忽略? 编译器做了哪些优化?
作为编程挑战的一部分,我需要从标准input读取空格分隔的整数序列( 在一行中 ),并将这些整数的总和打印到标准输出。 有问题的序列可以包含多达10,000,000个整数。 我有两个解决scheme:一个用Haskell编写( foo.hs ),另一个用Python 2( foo.py )编写。 不幸的是,(编译后的)Haskell程序比Python程序一直慢,我不知道如何解释这两个程序之间的性能差异。 请参阅下面的基准部分。 如果有的话,我会希望Haskell占上风。 我究竟做错了什么? 我怎样才能解释这种差异? 有没有简单的方法来加快我的Haskell代码? (有关信息,我正在使用8Gb RAM,GHC 7.8.4和Python 2.7.9的2010年中期Macbook Pro。) foo.hs main = print . sum =<< getIntList getIntList :: IO [Int] getIntList = fmap (map read . words) getLine (用ghc -O2 foo.hs编译) foo.py ns = map(int, raw_input().split()) print sum(ns) 基准 在下面, test.txt由一行1000万个空格分隔的整数组成。 # […]
如果你正在使用视图的道路,你如何确保良好的performance? 还是最好不要在第一时间使用视图,而只是将相应的语句合并到您的select语句中?
我用vim编辑了很多xml文件。 问题是,由于长行,vim中的导航/编辑非常慢。 有什么我可以做的(除了closures语法高亮/文件types插件和文件types缩进),以便能够编辑这些文件没有任何滞后? 令人沮丧的是,语法高亮等简单的事情被vim处理得如此糟糕。 我不记得这是任何其他编辑的问题。 我真的很喜欢使用vim,我希望有一些方法可以解决这个问题。
这是一个简单的memset带宽基准: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main() { unsigned long n, r, i; unsigned char *p; clock_t c0, c1; double elapsed; n = 1000 * 1000 * 1000; /* GB */ r = 100; /* repeat */ p = calloc(n, 1); c0 = clock(); for(i = 0; i < r; ++i) […]
我正在阅读一个大文件,并将每隔几行转换为Object的一个实例。 由于我正在循环该文件,我使用list.append(instance)将实例存储到列表,然后继续循环。 这是一个大约100MB左右的文件,因此不会太大,但是随着列表越来越大,循环逐渐减慢。 (我打印循环中每圈的时间)。 这不是固有的循环〜当我打印每一个新的实例,当我循环的文件,程序以恒定的速度进展〜只有当我把它们追加到列表慢慢。 我的朋友build议在while循环之前禁用垃圾收集,然后启用它并进行垃圾收集调用。 有没有其他人观察到类似的问题list.append变慢? 有没有其他办法可以绕过这个呢? 我会尝试下面的两个build议。 (1)“预先分配”记忆〜最好的办法是什么? (2)尝试使用deque 多篇文章(请参阅Alex Martelli的评论)提出了内存碎片(他拥有大量的可用内存,就像我一样),但对性能没有明显的修正。 要复制这种现象,请运行答案中提供的testing代码,并假定列表中有有用的数据。 gc.disable()和gc.enable()有助于计时。 我也会仔细分析所有的时间花在哪里。