我在毕业设计上做了一些工作,并在Lennard-Jones势和库仑势+分子间键合(如图)中实现了几个分子结构+力计算
(http://img17.imageshack.us/img17/3133/simulasyon.png)
所有在一个线程中完成Verlet算法。
问题是:我使用“计算表” - 阵列快速回答x ^(3.5),x ^(1.4),(1 / x)....因为使用本机计算速度非常慢java的方法。数组 - 访问时间真的很高,所以我尝试了“unsafe()”方法,但仍然非常慢(只有%10性能增益)。
尝试过IntBuffer和DoubleBuffer但仍然没有好处。
程序计算O(n)键计算,O(nlog(n))Lennard-Jones(+额外Pauli排除原理)和O(nlog(n))库仑力计算。 1500+粒子(和7000+键)的速度很差。
我已经检查了速度瓶颈在哪里(它是Lennard Jones + Coulomb)。 1500粒子的一次计算需要4毫秒。我需要它是1毫秒。
只有我可以像任何其他语言一样快速使用数组(安全与否)。
还尝试用乘法和散列映射和列表替换除法(与数组相同的性能)。
您是否知道减少每个时间步计算时间的其他方法? 谢谢。 计算机:2.0 GHz单核intel,1.2GB RAM,windows-XP SP-3和Eclipse Indigo。
答案 0 :(得分:1)
尝试使用切比雪夫多项式,而不是使用查找表。请记住,您只能在ln(k)步骤中取幂x ^ k。
它可能看起来像很多操作,但事实上,在没有命中内存(因此不影响缓存)的情况下可以使它明显快于查找表。