热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么Erlang/BEAMVM中的数学运算如此缓慢?

我试图理解为什么Erlang中的数学可能会这么慢,如果是这样,我可以做些什么来找出它慢的地方并尝试加快速度。有人说这是因为它是一个VM,但我对此表示怀疑,因为JVM的数学运算速度

我试图理解为什么 Erlang 中的数学可能会这么慢,如果是这样,我可以做些什么来找出它慢的地方并尝试加快速度。有人说这是因为它是一个 VM,但我对此表示怀疑,因为 JVM 的数学运算速度很快,V8 也是如此。其他人说这是因为它是一门不可变的语言,但 OCaml 是不可变的,并且在数学上非常快。那么是什么让 Erlang 在数学上变慢了,我将如何找到代码中它变慢的地方?我只能想象使用 DTrace,因为我不太了解我应该使用的 Linux/BSD 工具,而且我不知道哪些工具擅长分析 VM 中的代码和 VM 本身,以及这些需要不同的工具。

回答


在 OTP24 之前:

BEAM 没有 JIT,所以通常 erlang 编译器 ( erlc) 输出字节码:任何数学运算都需要访问 VM 寄存器(它们是内存位置),执行实际操作,将结果放在相关的 VM 寄存器中,然后跳转到下一条指令。与仅在机器代码中执行实际操作相比,这相当慢。

如果您使用任何直接编译为机器代码的语言(如 C),编译器将拥有更多关于代码和平台的信息,因此能够使用加速操作执行的功能,例如优化处理器的管道,使用矢量化指令,将最常访问的变量放在处理器的寄存器中,优化内存访问,以便它们访问缓存......

该HIPE编译器是有编译二郎代码本地人,如果你的程序使用了大量的数学,你应该使用它。不过,请务必检查其局限性。

如果HiPE编译器不够用,您始终可以用C编写关键的数学运算并将其包含在内。

此外,您应该通过比较 Erlang 和 C(以及其他)的纯数学问题来检查这个问题

关于不变性,除非将整数放在线程的堆(> 60 位)上,否则它不会产生任何影响,因为只有那些需要显式内存处理。

为了分析 Erlang 代码,您可以使用这些工具从内部处理 Erlang。

最后,您可以随时在此处发布您的代码片段,也许我们可以指出一些内容。

OTP24 之后:

Erlang 现在有 JIT,一些报告指出提高了 25%。






推荐阅读
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 子类从父类继承所有的成员(字段,方法,嵌套类),构造方法不属于成员,所有子类不能继承,但是子类可以调用父类的构造方法对于private方法和属性,子类一定是继承了的,但是没有访问权 ... [详细]
  • 这篇文章主要讲解了“如何应对Android面试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何应对 ... [详细]
  • 微信公众号:内核小王子关注可了解更多关于数据库,JVM内核相关的知识;如果你有任何疑问也可以加我pigpdong[^1]jvm一行代码是怎么运行的首先,java代码会被编译成字 ... [详细]
  • 技术周报·2021-05-07-小编推荐向现代Javascript转型原文标题:Publish,ship,andinstallmodernJavaScriptforfaste ... [详细]
  • 大厂首发!思源笔记docker
    JVMRedisJVM面试内存模型以及分区,需要详细到每个区放什么?GC的两种判定方法GC的三种收集方法:标记清除、标记整理、复制算法的 ... [详细]
author-avatar
书生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有