我需要替代Java,因为我正在研究遗传计算项目。 它需要大量的内存和大部分的CPU时间。因此,当我在服务器上部署它时它不起作用,因为许多人同时使用该程序。
是否有人知道另一种语言没有在虚拟机中运行并且类似于Java(面向对象,使用异常和类型安全)?
致以最诚挚的问候,
乔纳森
答案 0 :(得分:22)
回答直接问题:有几十种语言符合您的明确要求。 AmmoQ列出了一些; Wikipedia还有更多。
我认为你会对他们中的每一个人感到失望。
尽管Java仇恨者想要你想到,Java的表现与其他任何编译语言都没有太大的不同。只是改变语言不会提高性能。
通过获取分析器并查看您使用的算法,您可能会做得更好。
祝你好运!答案 1 :(得分:10)
如果您的应用程序占用了单用户工作站上的大部分CPU和内存,我怀疑将其转换为某种非VM语言会有很大帮助。使用Java,您可以依靠VM来处理内存管理等问题。你将不得不用非VM语言重新实现它们的等价物。此外,Java的内存管理非常好。您的应用程序可能不是实时敏感的,因此暂时暂停它不是问题。此外,无论如何,你将在多用户系统上运行它,对吗?
内存使用将更多地与您的底层数据结构和算法有关,而不是与语言有关的神奇之处。除非你为你选择的语言提供了一个非常好的内存分配器库,否则你可能会发现由于程序中的错误,你会使用尽可能多的内存(如果不是更多)。
由于您的应用程序是计算密集型的,因此除非您在整个代码中插入一些策略性的sleep()调用以故意使其更频繁地产生CPU,否则其他一些语言不太可能降低其性能。这会减慢速度,但对其他用户来说会更好。
尝试使用Java的-server选项运行您的应用程序。这将使用为长期运行的程序设计的VM,并包含一个将Java编译为本机代码的JIT。它可能会让你的程序运行得更快,但它仍然会受到CPU和内存的限制。
答案 2 :(得分:9)
如果你不喜欢C ++,你可以考虑使用谷歌的D,ObjectiveC或新的Go语言。
答案 3 :(得分:6)
您可以尝试使用C ++,它可以满足您的所有要求。
答案 4 :(得分:5)
使用Python以及numpy,scipy和matplotlib包。 numpy是一个Python包,其中包含用C实现的所有数字运算代码。因此,运行时性能(Python虚拟机的bcoz)不会成为问题。
如果您只想要编译的静态类型语言,请查看Haskell。
答案 5 :(得分:3)
您的算法可以并行化吗?
无论您使用何种语言,如果您使用单个流程,您可能会在某些时候遇到限制。使用像Hadoop这样的东西意味着你可以保留Java并且易于使用,但是你可以在许多机器上并行运行。
答案 6 :(得分:3)
与@Barry Brown的答案相同的主题:
如果您的应用程序在Java中是计算/内存密集型的,那么它可能是C ++中的计算/内存密集型或任何其他“更有效”的语言。你可能会有一些额外的余地......但你很快就会遇到同样的表演墙。
IMO,您需要做以下事情:
您需要对应用程序进行概要分析,并寻找任何主要的性能瓶颈。您可能会发现一些真正的惊喜。
根据上一步,审查设计和算法,注意空间和时间复杂性问题。做一些研究,看看是否有人发现了更好的算法来进行从性能角度来看有问题的计算。
如果前面的步骤没有让您领先于曲线,请查看您是否可以升级平台;获得更大的机器,更多的处理器,更多的内存等。
如果您仍处于困境,您唯一的另一种选择是横向扩展设计。假设在单线程中处理单个用户请求,重新构建系统,以便可以在多个服务器上运行“worker”,并在前面安装负载均衡器。如果您有持久的后端,请查看如何复制它。等等。
确定关键算法是否可以并行/分布,以便用户请求的资源密集型部分在多个处理器/多个服务器上并行执行;例如使用“map-reduce”框架。
好的,所以没有简单的答案。但仅仅改变编程语言并不是一个好的答案。
答案 7 :(得分:1)
无论语言如何,当您在一台计算机上运行多个实例时,您的程序都需要与他人共享。这就是计算机的工作方式。
允许当前程序扩展以使用可用硬件资源的最佳方法是将您的工作量分成小的独立部分,并使它们实现Callable接口。然后可以通过合适的Executor执行这些Executor,然后可以根据可用的硬件进行选择。有关许多预配置版本,请参阅Executors类。这是我建议你在这里做的。
如果您想切换语言,那么Mac OS X 10.6允许以上述C和ObjectiveC的方式进行编程,如果您正确地进行编程,OS X可以通过所有可用的计算资源(CPU和GPU以及我们)。
如果您对上述内容都不感兴趣,请考虑使用其中一个Grid框架。兵马俑可能是一个很好的起点。
答案 8 :(得分:0)
嗯..我认为你在寻找C#。
C#是面向对象的,并且对泛型有很好的支持。您可以使用它来编写WinForm和服务器端应用程序。
您可以在此处详细了解C#generics:http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx
编辑: 我的错误,geneTIcs,而不是geneRIcs。它不会改变C#将完成工作的事实,使用泛型将显着减少负载。
答案 9 :(得分:0)
F#或ruby,或python,它们非常适合计算,还有许多其他东西
NASA使用python
答案 10 :(得分:0)
您可能会发现计算机语言枪战here很有趣。 例如,这里是Java vs C++。
您可能会发现Ocaml(从中派生出F#)值得一看;它满足您对OO,异常,静态类型的要求,并且它具有本机编译器,但是根据shootout,您可能会以较低的速度交换较少的内存。