热门标签 | 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%。






推荐阅读
  • 本文探讨了使用Java创建高效且可靠的基准测试的方法,强调了选择合适的工具和理解潜在影响因素的重要性。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • 本文介绍如何配置SecureCRT以正确显示Linux终端的颜色,并解决中文显示问题。通过简单的步骤设置,可以显著提升使用体验。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • Java性能优化策略详解
    在Java开发中,性能优化是提高应用程序响应速度和资源利用率的关键。本文详细探讨了多种Java性能优化技巧,包括合理使用单例模式、避免滥用静态变量、减少对象创建、使用final修饰符、合理管理线程同步等,旨在帮助开发者写出更加高效稳定的代码。 ... [详细]
  • 收割机|篇幅_国内最牛逼的笔记,不接受反驳!!
    收割机|篇幅_国内最牛逼的笔记,不接受反驳!! ... [详细]
  • 本文记录了Android学习的初期阶段,包括Android的基本架构、Dalvik虚拟机与JVM的区别、ADB工具的使用以及应用程序的打包安装流程。 ... [详细]
  • 深入理解Java NIO:基础概念与原理
    本文介绍了Java NIO(New Input/Output)的基本概念,包括同步与异步、阻塞与非阻塞等核心理念,以及NIO相对于传统IO的优势和应用场景。通过详细解析这些概念,帮助读者更好地理解和掌握NIO的使用。 ... [详细]
  • Java性能优化指南 | 制定有效的性能优化策略
    探讨Java应用性能优化的方法与策略,包括性能测试技巧、常见问题及解决方案,旨在帮助开发者提升系统性能。 ... [详细]
  • 本文详细介绍如何在64位Windows 7操作系统上安装和配置CUDA 7.5/8.0及cuDNN 5.0,包括必要的系统要求和详细的安装步骤。 ... [详细]
  • 本文介绍了如何在三台CentOS 7.5虚拟机上通过Docker部署RabbitMQ集群,包括环境准备、容器创建、集群配置及故障处理等内容。 ... [详细]
  • VMware 15.5.7 中文版激活方法
    本文提供了一种有效的方法来激活 VMware 15.5.7 的中文版本,同时介绍了如何利用最新的激活码进行操作,确保用户能够顺利使用。 ... [详细]
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社区 版权所有