【发布时间】:2012-06-20 18:33:31
【问题描述】:
我在毕业设计中做了一些工作,实现了几个分子结构+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(+ 额外泡利不相容原理)和 O(nlog(n)) 库仑力计算。 1500 多个粒子(和 7000 多个键)时速度很差。
我已经检查了速度瓶颈在哪里(它是 Lennard Jones + Coulomb)。 1500 个粒子的一个时间步计算需要 4 毫秒。我需要它是 1 毫秒。
只有当我可以像使用任何其他语言一样快地使用数组时(安全与否)。
还尝试用乘法和哈希映射和列表替换除法(数组的性能相同)。
您知道减少每个时间步的计算时间的其他方法吗? 谢谢你。 计算机:2.0 GHz 单核英特尔、1.2GB RAM、windows-XP SP-3 和 Eclipse Indigo。
【问题讨论】:
-
有趣的问题 - 我已经稍微重新标记了它,以提高你让合适的人参与的机会。您可能想发布一些代码,特别是一个小示例,显示计算速度(慢),以及当您尝试解决这个问题时数组的(慢)速度。
-
现代处理器和内存之间的速度差距比 15 年前要大得多。您是否尝试过仅计算这些值而不是使用查找表?
-
我已经尝试过使用单变量进行内存测试。单个 'final a=...' 类型变量至少快 5-8 倍。像任何其他语言一样,访问单个变量既简单又快速。数组有问题。我什至用本地数组替换了数组以获得一些速度,但又不够(增加 %5)。如果“if”语句是零时间计算,我可以制作 2000000 个单个变量。即便如此,添加 2M 个单一变量也需要数年时间:)。这是一些示例代码:
-
1) 查看每个相邻网格(正方形) 2) 查看这些网格中的每个粒子。 3)距离 'Math.sqrt(vxvx+vyvy))' 有点慢,所以我尝试了 'answer_array[(int)(vxvx+vyvy) ]' 4) 在 Lennard-Jones 和 Coulomb 势下获得力 '1.0/distance' 很慢,所以我使用了 'division_array[(int)distance]' 然后 'Math.pow(x,n)' 很慢 x xx* 也不够!我使用'power_n_array [x]' 5)如果有任何'f = k *(balance_distance-distance)',即使为此我也使用'f = k_matrix [(int)(delta_distance)]'这是最快的我可以。 “数组访问时间”为 3 个单位(单次为 0.4 个单位)
-
如果你能把代码贴在某个地方会更容易提供帮助......
标签: java arrays performance optimization particles