为了好玩,我正在做各种语言的简单OpenGL基准测试,我刚刚完成了Clojure实现。然而,它运行速度很慢,所以我决定使用VisualVM对其进行分析,然后我获得了一些相当奇怪的结果。以下是分别来自Java和Clojure版本的配置文件的快照(两者都具有相同的渲染逻辑)
请注意,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);
}
这两个功能对我来说似乎是一样的;我正在制作一些错误吗?或者我读错了配置文件?
答案 0 :(得分:2)
这些功能之间存在一些差异:
(:x apt)
始终返回一个盒装数值,因为它不是类型提示。 pt.X
可能会返回未装箱的数字原语,具体取决于Pt
的定义。
(:x apt)
将执行哈希查找,而不是pt.X
执行的更快的槽查找(除非apt是Clojure记录,否则您没有显示足够的代码让我知道这是哪个,所以我假设它是一个哈希映射。)
默认情况下,Clojure中的数字文字为Long
,默认情况下为Integer
。