为什么在相同条件下运行的这两段代码在运行时间上没有差异?
代码1
static long time = 0;
static int n = 200;
static float[] vq = new float[200 * 200 * 200 * 3];
static int[] iq = new int[200 * 200 * 200];
static FloatBuffer verts = BufferUtils.createFloatBuffer(vq.length);
static IntBuffer ind = BufferUtils.createIntBuffer(iq.length);
static void draw() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
int index = (i * n * n) + (j * n) + k;
vq[3 * index + 0] = i;
vq[3 * index + 1] = j;
vq[3 * index + 2] = k;
iq[index] = index;
}
}
}
verts.put(vq);
ind.put(iq);
verts.flip();
ind.flip();
GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
GL11.glVertexPointer(3, 0, verts);
GL11.glDrawElements(GL11.GL_QUADS, ind);
GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
long newTime = System.currentTimeMillis();
System.out.println(newTime - time);
time = newTime;
}
代码2
static int n = 200;
static long time = 0;
static void draw() {
GL11.glBegin(GL11.GL_QUADS);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
GL11.glVertex3f(i, j, k);
}
}
}
GL11.glEnd();
long newTime = System.currentTimeMillis();
System.out.println(newTime - time);
time = newTime;
}
我认为代码2 应该比 Code1 慢的原因是,它有近800万次本机通话,但代码1 有只是少数,他们在结果中做同样的事情。
是什么原因,我怎样才能提高代码的性能?
答案 0 :(得分:1)
代码1包括将值复制到数组中,然后将数组复制到本机内存中 - 如果n保持不变,则只需执行一次即可避免此开销。
答案 1 :(得分:0)
这里重要的是OpenGL方法的作用,因为如果代码2的glVertexPointer
和glDrawElements
方法遍历提供的数组,那么最终会得到与您一样多的迭代和方法在代码1中,您可以自己处理迭代。我不熟悉OpenGL,但我认为glVertexPointer
和glDrawElements
需要迭代所提供的数组,以创建相应的在每个元素上调用glVertex3f。
简而言之,无论是在java代码中还是在加载的库本身中,迭代次数和本机方法调用都大致相当。
至于改进你的代码,我无话可说,因为我从未使用过OpenGL。