小编tim*_*day的帖子

为什么对此Scala代码进行少量更改会对性能产生如此巨大的影响?

我正在使用32位Debian 6.0(Squeeze)系统(2.5 GHz Core 2 CPU),sun-java6 6.24-1,但使用Wheezy的Scala 2.8.1软件包.

编译的此代码scalac -optimise运行时间超过30秒:

object Performance {

  import scala.annotation.tailrec

  @tailrec def gcd(x:Int,y:Int):Int = {
    if (x == 0)
      y 
    else 
      gcd(y%x,x)
  }

  val p = 1009
  val q = 3643
  val t = (p-1)*(q-1)

  val es = (2 until t).filter(gcd(_,t) == 1)
  def main(args:Array[String]) {
    println(es.length)
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将val es=一行向下移动并在范围内进行微不足道的改变main,那么它仅在1秒内运行,这更像我期望看到的并且与等效C++的性能相当.有趣的是,离开val es=原来的地方但同样合格lazy也具有相同的加速效果.

这里发生了什么?为什么在函数范围之外执行计算要慢得多?

optimization performance scala

57
推荐指数
2
解决办法
1639
查看次数

如何在matplotlib mplot3D中显示3D阵列等值面的三维图?

我有一个三维numpy数组.我想(在matplotlib中)显示这个数组的等值面的一个漂亮的3D图(或者更严格地说,显示通过在样本点之间插值定义的3D标量场的等值面).

matplotlib的mplot3D部分提供了很好的3D绘图支持,但是(据我所知)它的API没有任何东西可以简单地采用标量值的3D数组并显示等值面.但是,它确实支持显示多边形集合,因此我可以实现行进立方体算法来生成这样的多边形.

似乎很可能已经在某处实现了一个友好的行进立方体并且我没有找到它,或者我错过了一些简单的方法.或者,我欢迎任何指向其他工具的指针,以便可视化从Python/numpy/scipy世界中轻松使用的3D数组数据.

python visualization volume matplotlib scipy

42
推荐指数
3
解决办法
3万
查看次数

在Linux上更快地分叉大型进程?

什么是现代的Linux实现的同样的效果最快,最好的方法fork- execve组合从一个大的过程

我的问题是,分叉过程大约为500MBy,并且一个简单的基准测试只能从该过程中获得大约50个分叉/秒(参见最小尺寸过程的~10000分叉/秒),这对于预期的应用来说太慢了.

一些谷歌搜索出现了,vfork因为它被发明为这个问题的解决方案......但也警告不要使用它.现代Linux似乎已经获得了相关cloneposix_spawn呼叫; 这些可能会有所帮助吗?什么是现代的替代品vfork

我在i7上使用64位Debian Lenny(如果posix_spawn有帮助,该项目可以转移到Squeeze ).

linux debian fork process exec

30
推荐指数
4
解决办法
2万
查看次数

我应该担心英特尔C++编译器为AMD发出次优代码?

我们一直是英特尔商店.所有开发人员都使用英特尔机器,最终用户的推荐平台是英特尔,如果最终用户希望在AMD上运行,那就是他们的了望.也许测试部门有一台AMD机器在哪里检查我们没有运送任何完全损坏的东西,但那是关于它的.

直到几年前我们才使用MSVC编译器,因为它并没有真正提供超出SSE级别的许多处理器调优选项,所以没有人担心代码是否有利于x86供应商而不是另一个.但是,最近我们一直在使用英特尔编译器.我们的东西肯定会从它(在我们的英特尔硬件上)获得一些显着的性能优势,并且它的矢量化功能意味着更少需要去asm/intrinsics.然而,人们开始对英特尔编译器是否真的不能为AMD硬件做得如此出色而感到有些紧张.当然,如果你进入英特尔CRT或IPP库,你会看到许多cpuid查询显然设置跳转表到优化的功能.看起来英特尔似乎不太可能为AMD芯片做任何好事.

任何有这方面经验的人都可以评论这在实践中是否是一个大问题?(我们还没有真正对AMD进行任何性能测试).

更新2010-01-04:支持AMD的需求从来没有变得足够让我自己做任何测试.还有在这个问题上一些有趣的阅读在这里,这里这里虽然.

更新2010-08-09:看来英特尔-FTC和解有话要说这个问题-请参阅"编译器和肮脏的把戏"的部分文章.

c++ compiler-construction optimization intel amd-processor

28
推荐指数
3
解决办法
3676
查看次数

在没有中间栅格的情况下在OpenGL中显示SVG

我有一些简单的SVG图片(图标和字形的东西),我想在OpenGL应用程序中显示(使用Qt在Debian上使用C++开发).

显而易见的解决方案是使用ImageMagick库 SVG 转换为光栅图像,纹理将它们映射到一些合适的多边形(或者只使用旧的glDrawPixels).

但是,我想知道是否有任何东西可以将SVG直接转换为一系列OpenGL调用并使用OpenGL的线条,多边形等进行渲染.任何人都知道有什么可以做到这一点?

c++ opengl graphics svg

28
推荐指数
2
解决办法
2万
查看次数

英特尔TBB的Scalable_allocator如何工作?

什么是tbb::scalable_allocator英特尔线程构建模块实际上是引擎盖下呢?

它肯定是有效的.我刚用它来采取25%的折扣的应用程式的执行时间(并看到在CPU利用率从〜200%4核系统上增加至350%),通过改变单个std::vector<T>std::vector<T,tbb::scalable_allocator<T> >.另一方面,在另一个应用程序中,我看到它将已经很大的内存消耗加倍并将内容发送到交换城市.

英特尔自己的文档并没有给出太多帮助(例如本常见问题解答末尾的简短部分 ).在我自己去挖掘代码之前,谁能告诉我它使用了什么技巧?

更新:刚刚第一次使用TBB 3.0,并且从Scalable_allocator看到了我最好的加速.改变单一vector<int>vector<int,scalable_allocator<int> >(从测试的Debian莱尼,核2,与TBB 3.0)的从85S东西35S减少的运行时间.

c++ malloc multithreading stl tbb

27
推荐指数
1
解决办法
2万
查看次数

你有没有通过使用boost :: pool获得显着的加速?

我曾经在boost :: pool中玩了几次,在我看来我正在用很多对象"churn"认真地敲打堆.通常我已经使用过boost::object_pool,或者boost::pool_alloc作为STL模板参数.然而,结果总是表明性能几乎没有变化,或者显着恶化.

我很想知道它有任何成功的故事.

我应该在分析输出中寻找什么样的东西,这可能表明boost :: pool可能会有所帮助?

实际上很难改进好的旧malloc吗?

c++ malloc optimization boost memory-management

26
推荐指数
3
解决办法
9015
查看次数

在什么情况下大页面可以产生加速?

现代x86 CPU能够支持比传统4K更大的页面大小(即2MB或4MB),并且有操作系统(Linux,Windows)可以访问此功能.

上面的Microsoft链接声明大页面"提高了转换缓冲区的效率,这可以提高频繁访问的内存的性能".这对于预测大页面是否会改善任何特定情况并不是很有帮助.我对具体的,最好是量化的例子感兴趣,其中一些程序逻辑(或整个应用程序)移动使用大页面导致一些性能改进.有人有成功的故事吗?

我知道自己有一个特殊情况:使用大页面可以大大减少分支大型进程所需的时间(可能是因为需要复制的TLB记录数量减少了1000个数量级).我很感兴趣的是,在不那么奇特的场景中,大页面是否也可以带来好处.

performance x86 virtual-memory tlb

20
推荐指数
2
解决办法
2887
查看次数

为什么我的scala期货不是更有效率?

我在32位四核Core2系统上运行此scala代码:

def job(i:Int,s:Int):Long = {
  val r=(i to 500000000 by s).map(_.toLong).foldLeft(0L)(_+_)
  println("Job "+i+" done")
  r
}

import scala.actors.Future
import scala.actors.Futures._

val JOBS=4

val jobs=(0 until JOBS).toList.map(i=>future {job(i,JOBS)})
println("Running...")
val results=jobs.map(f=>f())
println(results.foldLeft(0L)(_+_))
Run Code Online (Sandbox Code Playgroud)

(是的,我知道有多少更有效的方式来总结一系列整数,它只是给了CPU事做).

根据我设置JOBS的内容,代码在以下时间运行:

JOBS=1 : 31.99user 0.84system 0:28.87elapsed 113%CPU
JOBS=2 : 27.71user 1.12system 0:14.74elapsed 195%CPU
JOBS=3 : 33.19user 0.39system 0:13.02elapsed 257%CPU
JOBS=4 : 49.08user 8.46system 0:22.71elapsed 253%CPU
Run Code Online (Sandbox Code Playgroud)

令我感到惊讶的是,这并没有真正扩展到超过2个未来"在游戏中".我做了很多多线程C++代码,毫无疑问我可以很好地扩展到4个内核,如果我用英特尔的TBB编写这类东西,或者boost::threads当然会更加冗长,那么可以看到> 390%的CPU利用率).

那么:发生了什么,如何扩展到我希望看到的4个核心?这是否受到scala或JVM中某些内容的限制?它发生在我身上我实际上并不知道"哪里"scala的期货运行...是每个未来产生的线程,还是"Futures"提供专用于运行它们的线程池?

[我在使用sun-java6(6-20-0lennny1)的Lenny系统上使用来自Debian/Squeeze的scala 2.7.7软件包.]

更新:

正如Rex的回答中所建议的那样,我重新编码以避免创建对象.

def job(i:Long,s:Long):Long = {
  var t=0L
  var v=i
  while (v<=10000000000L) …
Run Code Online (Sandbox Code Playgroud)

performance multithreading scala scalability future

17
推荐指数
1
解决办法
1853
查看次数

如何用LXML编写命名空间元素属性?

我正在使用lxml(2.2.8)来创建和编写一些XML(特别是XGMML).将要阅读它的应用程序显然相当挑剔,并希望看到一个顶级元素:

<graph label="Test" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="h
ttp://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-
ns#" xmlns:cy="http://www.cytoscape.org" xmlns="http://www.cs.rpi.edu/XGMML"  di
rected="1">
Run Code Online (Sandbox Code Playgroud)

如何xmlns:使用lxml 设置这些属性?如果我尝试明显的

root.attrib['xmlns:dc']='http://purl.org/dc/elements/1.1/'
root.attrib['xmlns:xlink']='http://www.w3.org/1999/xlink'
root.attrib['xmlns:rdf']='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
root.attrib['xmlns:cy']='http://www.cytoscape.org'
root.attrib['xmlns']='http://www.cs.rpi.edu/XGMML'
Run Code Online (Sandbox Code Playgroud)

lxml抛出一个 ValueError: Invalid attribute name u'xmlns:dc'

我过去曾经使用过很多XML和lxml来处理简单的事情,但是到目前为止还是设法避免需要知道关于命名空间的任何事情.

python lxml xml-namespaces cytoscape

17
推荐指数
2
解决办法
1万
查看次数