Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数编程的数字压缩性能(使用java 8)_Java_Performance_Functional Programming_Numerical Methods - Fatal编程技术网

函数编程的数字压缩性能(使用java 8)

函数编程的数字压缩性能(使用java 8),java,performance,functional-programming,numerical-methods,Java,Performance,Functional Programming,Numerical Methods,我主要使用C/Fotran/numpy进行一些数值/物理模拟,我使用Java(尤其是和)只是为了在代码原型化过程中获得一些实时交互 最近我读到了Java 8的新特性,即: Lambda表情(观看) 建议支持并行、异构计算(GPGPU、OpenCL)项目 对我来说,这似乎有点矛盾——函数编程和数值性能。也许这只是我的偏见 典型的论点如下: 函数样式声明使代码更易于并行化和 给予编译器比严格意义上更大的优化机会 顺序循环和可变数据类型 好的,从理论上讲这是有道理的,但在实践中,像haskell、

我主要使用C/Fotran/numpy进行一些数值/物理模拟,我使用Java(尤其是和)只是为了在代码原型化过程中获得一些实时交互

最近我读到了Java 8的新特性,即:

  • Lambda表情(观看)
  • 建议支持并行、异构计算(GPGPU、OpenCL)项目
对我来说,这似乎有点矛盾——函数编程和数值性能。也许这只是我的偏见

典型的论点如下:

函数样式声明使代码更易于并行化和 给予编译器比严格意义上更大的优化机会 顺序循环和可变数据类型

好的,从理论上讲这是有道理的,但在实践中,像haskell、Erlang、Clojure和List这样的函数式编程语言中常见的数字粉碎操作似乎比C或Java这样的命令式语言慢得多。这可能与您为抽象支付了大量操作这一事实有关——函数构造与机器代码以及处理器的工作方式相差太远。这就是为什么我对函数式编程从不感兴趣

所以我的问题是:

  • Java8中函数编程的期望。我是否应该关心并尝试了解我感兴趣的领域是否是性能关键的数字代码
  • 使用函数构造而不是带循环的普通命令式代码是否会导致性能损失?(我的意思是在简单的任务中,比如质数测试,或者计算点积)
  • Java8带来了一些漂亮而简洁的语法结构,通用而可靠,但功能性不强的流执行/并行化框架。但它并没有真正意义上的JIT编译和内联改进,这些改进可能对处理大量代码非常有用。例如,Java7的匿名类比lambdas丑陋得多。

    因此,您的问题的答案是:不,如果您对Java7和性能不感兴趣,那么您关心的不是编码的方便性

  • 在足够简单的情况下,当代码非常热时,可能由于更深入的内联而更改了JVM标志,理想情况下,没有惩罚。但除此之外,还有一些(虽然不是很大)惩罚。即使JIT执行内联,在大多数情况下也不会完美地折叠机器代码


  • 对于数字粉碎来说,它肯定会更有趣,但很难说它什么时候会出现在Java中(如果有的话)。

    我发现新的功能特性并不是最优化的方式,而是给老化的Java语言注入更多活力的一种方式。事实上,在我的工作环境中,我尽量避免使用函数语法,直到代码质量工具等能够解析它为止

    使用函数特性很好,但是为什么不选择一种从函数开始的语言,比如Scala呢。或者至少是比Java更现代的东西,比如Ruby

    当然,新语法很好,但仍然感觉像是在XML文件中编写yaml。它本身看起来不错,但也有点可笑,因为周围的一切都是老式的