Articles of 优化

优化C ++二维数组

我需要一种方法来表示C ++中的双精度二维数组(密集matrix),并具有绝对最小的访问开销。 我已经在各种linux / unix机器和gcc版本上做了一些时机。 STLvectorvector,声明如下: vector<vector<double> > matrix(n,vector<double>(n)); 并且通过matrix[i][j]进行访问比访问声明的数组慢5%到100% double *matrix = new double[n*n]; 通过内联索引函数matrix[index(i,j)] ,其中index(i,j)计算结果为i + n * j。 其他不用STL排列二维数组的方法 – 一个n指针数组指向每一行的开始,或者定义堆栈上的整个事物为一个常数大小的matrix[n][n] – 几乎完全相同速度为指标函数法。 当开启优化时,最近的GCC版本(> 4.0)似乎能够将STLvector向量编译成几乎与非STL代码相同的效率,但这有点依赖于机器。 我想尽可能使用STL,但是必须select最快的解决scheme。 有没有人有任何与GCC优化STL的经验?

Java内存的奥秘(我有泄漏)?

我有一个独立的Java问题在Linux服务器上运行。 我用-Xmx256m开始了jvm。 我附加了一个JMX监视器,可以看到堆永远不会真的通过256Mb。 但是,在我的Linux系统上运行顶层命令时,我可以看到: 1)首先,这个过程的RES内存使用量约为350Mb。 为什么? 我想这是因为堆外的记忆? 2)其次,这个过程的VIRT内存使用量正在不断增长和增长。 它永远不会停止! 现在显示在2500Mb! 所以我有泄漏? 但堆不增加,它只是循环! 最终,这会造成一个问题,因为系统交换不断增长,最终导致系统死亡。 任何想法是怎么回事? 我想问的一个重要问题是,这可能是我的代码的结果,而不是JVM,内核等的一些情况。例如,如果线程的数量不断增加,那么是否符合我的观察的描述? 任何类似的东西,你可以build议我留意?

当传递参数作为编译时间常量或variables时,函数性能之间的差异

在Linux内核代码中有一个用于testing的macros(Linux版本2.6.2): #define test_bit(nr, addr) \ (__builtin_constant_p((nr)) \ ? constant_test_bit((nr), (addr)) \ : variable_test_bit((nr), (addr))) 其中constant_test_bit和variable_test_bit被定义为: static inline int constant_test_bit(int nr, const volatile unsigned long *addr ) { return ((1UL << (nr & 31)) & (addr[nr >> 5])) != 0; } static __inline__ int variable_test_bit(int nr, const volatile unsigned long *addr) { int oldbit; __asm__ __volatile__( […]

直写RAM磁盘或文件系统的大规模caching?

我有一个非常严重的文件系统,读取和写入一组工作文件的程序。 这些文件的大小是几千兆字节,但不会太大,以至于不适合放在RAM磁盘上。 运行该程序的机器通常是Ubuntu Linux机器。 有没有办法configuration文件pipe理器有一个非常非常大的caching,甚至caching写入,以便他们以后点击磁盘? 或者有没有办法创build一个写入实际磁盘的RAM磁盘?

软件来调整/校准启发式algorithm的属性

今天我读了一个名为WinCalibra的软件(向下滚动),它可以把一个带有属性的文本文件作为input。 然后该程序可以根据algorithm的输出值优化input属性。 有关更多信息,请参阅本文或用户文档(请参阅上面的链接;可悲的是,doc是压缩的exe文件)。 你知道其他软件可以做到这一点,在Linux下运行? (最好是开源) 编辑 :因为我需要这个Java应用程序:我应该把我的研究投资在像高卢或制表师的 Java库吗? 问题是我不想推出我自己的解决scheme,也没有时间这样做。 你有没有像Calibra这样的开箱即用的应用程序的指针? (互联网search不成功;我只find库) 我决定放弃赏金(否则没有人会有好处),虽然我没有find一个令人满意的解决scheme:-((开箱即用的应用程序)

为什么不执行报告caching未命中?

根据perf教程 , perf stat应该使用硬件计数器报告caching未命中。 但是,在我的系统上(最新的Arch Linux),它并没有: [joel@panda goog]$ perf stat ./hash Performance counter stats for './hash': 869.447863 task-clock # 0.997 CPUs utilized 92 context-switches # 0.106 K/sec 4 cpu-migrations # 0.005 K/sec 1,041 page-faults # 0.001 M/sec 2,628,646,296 cycles # 3.023 GHz 819,269,992 stalled-cycles-frontend # 31.17% frontend cycles idle 132,355,435 stalled-cycles-backend # 5.04% backend cycles […]

用户空间代码中可能使用/不太可能使用macros吗?

我在Linux内核代码中遇到了这两个macros。 我知道它们是分支情况下编译器(gcc)优化的指令。 我的问题是,我们可以在用户空间代码中使用这些macros吗? 它会给任何优化? 任何示例都将非常有帮助。

内存密集型应用中的内存pipe理

如果您在Windows上使用C ++开发一个内存密集型应用程序,您是否select编写自己的自定义内存pipe理器来从虚拟地址空间分配内存,还是允许CRT控制并为您执行内存pipe理? 我特别关心堆上的小对象的分配和释放造成的碎片。 正因为如此,我认为这个过程将会耗尽内存,尽pipe有足够的内存但是是分散的。

我可以在现代英特尔酷睿CPU上测量分支预测故障吗?

这个问题及其答案,最近被标记为一个史诗般的答案,促使我想知道; 在CPU分支预测失败方面,我可以测量Windows中正在运行的应用程序的性能吗? 我知道存在一些静态分析工具,这可能有助于在分支预测情况下优化代码以获得良好性能,手动技术可以通过简单地进行更改和重新testing来提供帮助,但是我正在寻找一些自动机制在一段时间内报告一个分支预测失败的总数,当一个Windows应用程序运行时,我希望一些用于Visual C ++的Profiler工具可以帮助我。 为了这个问题,有问题的应用程序要么使用本地编译器(例如Visual C ++ for Windows),要么使用其他本机编译器(如GCC,FreePascal,Delphi或TurboAssembler)构build。 可执行文件可能根本没有任何debugging信息。 我想知道是否可以检测并计算分支预测失败,也许可以通过像WMI这样的Windows服务读取内部CPU信息,也可以通过运行Windows的虚拟环境(如使用VirtualBox)完全运行,然后完全运行使用我的testing应用程序在VirtualBox中虚拟化Windows环境,并对虚拟CPU进行运行时分析。 或者其他一些我不知道的技术,就是这个问题。 是的,我GOOGLE了。 唯一看起来很有前途的是来自AMD的PDF 。 提到的东西与我想要做的非常接近,但似乎是针对没有任何操作系统的人员在原始评估硬件平台上编写的: 5.1。 分行。 适用性。 有条件的分支预测失误可能是代码中的一个重要问题,有很多决策逻辑。 当select真或假path的可能性是随机的或接近50-50分裂时,条件分支可能被错误预测。 分支预测硬件不能“学习”模式,分支预测不正确。 采集。 收集此表中的事件以测量分支预测性能: 分支使用以下公式计算分支采取的比率和每个分支的指令数量的比率:分支采取率= Taken_branches / Ret_instructions分支采取比率= Taken_branches /分支 每个分支的指令= Ret_instructions /分支 更新:我想我可以说我正在寻找一种方法来阅读英特尔酷睿i7 PMU模块,或其他CPU的等效function。 看起来英特尔VTUNE(来自Adrian的评论)非常接近我所要求的。

生成最快的可执行文件

我有一个非常大的程序,我一直在visual studio下编译(v6然后迁移到2008)。 我需要可执行文件尽可能快地运行。 该程序花费大部分时间处理各种大小的整数,并且IO很less。 很明显,我会select最大化优化,但似乎有很多事情可以做,而不是在优化的标题下,这仍然会影响可执行文件的速度。 例如,select__fastcall调用约定或将结构成员alignment设置为一个大数字。 所以我的问题是:有没有其他的编译器/链接器选项,我应该用来使程序更快,而不是从“属性”对话框的“优化”页面进行控制。 编辑:我已经广泛使用探查器。