为什么相同的OpenGL函数在Clojure中的表现与在Java中表现的不同?

时间:2014-01-15 11:31:41

标签: java opengl clojure

为了好玩,我正在做各种语言的简单OpenGL基准测试,我刚刚完成了Clojure实现。然而,它运行速度很慢,所以我决定使用VisualVM对其进行分析,然后我获得了一些相当奇怪的结果。以下是分别来自Java和Clojure版本的配置文件的快照(两者都具有相同的渲染逻辑)

Java profiling screencap

Clojure profiling screencap

请注意,glPopMatrix是Clojure实现中占用时间最多的函数,但是在Java实现中,glDrawArrays需要更多的时间。 Clojure version的代码是:

(defn render-pt [apt]
  (GL11/glPopMatrix)
  (GL11/glPushMatrix)
  (GL11/glTranslatef (:x apt) (:y apt) (- 0 (:z apt)) )
  (GL11/glScalef (* (:R apt) 2) (* (:R apt) 2) (* (:R apt) 2) )
  (GL11/glDrawArrays GL11/GL_QUADS 0 24)
  apt)

函数render-pt被映射到pt数组。

Java version的代码是:

for (int i = minPt; i < numPts; i++) {
    Pt pt = Pts[i];
    GL11.glPopMatrix();
    GL11.glPushMatrix();
    GL11.glTranslatef(pt.X, pt.Y, -pt.Z);
    GL11.glScalef(pt.R * 2, pt.R * 2, pt.R * 2);
    GL11.glDrawArrays(GL11.GL_QUADS, 0, 24);
}

这两个功能对我来说似乎是一样的;我正在制作一些错误吗?或者我读错了配置文件?

1 个答案:

答案 0 :(得分:2)

这些功能之间存在一些差异:

(:x apt)始终返回一个盒装数值,因为它不是类型提示。 pt.X可能会返回未装箱的数字原语,具体取决于Pt的定义。

(:x apt)将执行哈希查找,而不是pt.X执行的更快的槽查找(除非apt是Clojure记录,否则您没有显示足够的代码让我知道这是哪个,所以我假设它是一个哈希映射。)

默认情况下,Clojure中的数字文字为Long,默认情况下为Integer