在哪里编写这种启发式代码?

时间:2011-04-07 10:19:20

标签: java programming-languages integration mathematical-optimization

我想问一个复杂的问题。

我必须为我的论文编写启发式代码。我需要以下:

  • 评估一些积分函数
  • 在一定时间间隔内最小化功能
  • 这样做了一千多次。

所以我需要一种更快的编程语言来完成这些工作。你建议使用哪种语言?首先,我从Java开始,但采用积分成为一个问题。而且我不确定速度。

连接Java和MATLAB等其他软件可能是一个好主意。由于我不确定,我想听取您的意见。

谢谢!

4 个答案:

答案 0 :(得分:1)

C,Java,...都是图灵完整的语言。他们可以以相同的精度计算相同的函数。 如果您想要达到性能目标,请使用C语言编译和高性能语言。可以减少计算时间,避免在Java等解释语言中出现方法调用和高级特性。

无论如何,请记住,您的实现可能会比您选择的语言更多地影响性能,因为增加输​​入维度是相关的计算复杂性(http://en.wikipedia.org/wiki/Computational_complexity_theory)。

答案 1 :(得分:1)

这不是编程语言,它可能是你的算法。确定算法的big0表示法。如果你在循环中使用循环,你可以在地图中使用散列搜索,那么你的算法可以快n倍。

注意:现代JVM(JDK 1.5或1.6)将即时本机(如未解释)编译为特定操作系统和特定操作系统版本以及特定硬件体系结构。您可以更积极地尝试-server到JIT(以更长的初始化时间为代价)。

  

这样做了一千多次。

你确定它不是更多,比如10^1000吗?尝试准确计算运行该循环所需的次数,这可能会让您感到惊讶。使用启发式的问题类型往往具有非常大的搜索空间。

答案 2 :(得分:0)

在开始切换语言之前,我首先尝试执行以下操作:

  1. 找到最佳算法。
  2. 查找可从您的语言中使用的那些算法的可用实现。 例如有Java的科学库。尝试使用这些库。
  3. 如果他们不够快,请调查是否有任何事情要做。您的问题是否比库假设的更具体。您是否能够基于该知识改进算法。
  4. 什么需要这么多/记忆?这真的与你的语言有关吗?尽量避免观察JVM开始时间而不是为您执行计算的时间。
  5. 然后,我会考虑切换语言。但是不要指望在c。
  6. 中轻松击败优化的第三方java库

答案 3 :(得分:0)

算法顺序

在语言之间切换只会减少常数因子所需的时间。假设您可以使用C将速度提高一倍,但如果您的算法为O(n^2),则无论使用何种语言,如果您将数据加倍,则需要处理四次。

JVM可以优化很多事情,从而获得良好的效果。

Java中的一些可行的优化

如果您有很多次调用的函数,请将它们 final 。整个班级也一样。编译器将知道它可以内联方法代码,避免为该调用创建方法调用堆栈帧。