我已经采取了问题#12从项目欧拉作为编程练习和我的(肯定不是最优的)实现在C,Python和Erlang和Haskell的比较.为了获得更高的执行时间,我搜索第一个三角形数字,其中有超过1000个除数而不是原始问题中所述的500.
结果如下:
C:
lorenzo@enzo:~/erlang$ gcc -lm -o euler12.bin euler12.c
lorenzo@enzo:~/erlang$ time ./euler12.bin
842161320
real 0m11.074s
user 0m11.070s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
lorenzo@enzo:~/erlang$ time ./euler12.py
842161320
real 1m16.632s
user 1m16.370s
sys 0m0.250s
Run Code Online (Sandbox Code Playgroud)
Python与PyPy:
lorenzo@enzo:~/Downloads/pypy-c-jit-43780-b590cf6de419-linux64/bin$ time ./pypy /home/lorenzo/erlang/euler12.py
842161320
real 0m13.082s
user 0m13.050s
sys 0m0.020s
Run Code Online (Sandbox Code Playgroud)
二郎:
lorenzo@enzo:~/erlang$ erlc euler12.erl
lorenzo@enzo:~/erlang$ time erl -s euler12 solve
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.4 (abort with ^G)
1> 842161320
real 0m48.259s
user 0m48.070s
sys 0m0.020s
Run Code Online (Sandbox Code Playgroud)
哈斯克尔: …
我正在学习Elixir,并想知道为什么它有两种类型的函数定义:
def,调用usingmyfunction(param1, param2)fn,调用usingmyfn.(param1, param2)只有第二种函数似乎是第一类函数,可以作为参数传递给其他函数.模块中定义的函数需要包装在一个fn.有一些语法糖似乎是otherfunction(myfunction(&1, &2))为了使这容易,但为什么它首先是必要的?我们为什么不能这样做otherfunction(myfunction))?是否只允许调用模块函数而不像Ruby那样括号?它似乎从Erlang继承了这个特性,它也具有模块功能和实用程序,所以它实际上来自Erlang VM如何在内部工作?
有两种类型的函数并从一种类型转换为另一种类型以便将它们传递给其他函数有什么好处?呼叫功能有两种不同的符号吗?
我想知道成功与否使用Erlang的最常见应用程序/网站/解决方案列表.
解释为什么将它用于特定解决方案而不是其他编程语言也将非常受欢迎.
列出BAD Erlang案例研究(Erlang被滥用的情况),它也会很有趣.
来自Erlang Programming(2009):
Erlang并发性快速且可扩展.它的进程是轻量级的,因为Erlang虚拟机不会为每个创建的进程创建一个OS线程.它们在VM中创建,调度和处理,与底层操作系统无关.结果,进程创建时间大约为微秒,并且与并发存在的进程的数量无关.将其与Java和C#进行比较,其中为每个进程创建底层OS线程:您将获得一些非常有竞争力的比较,Erlang大大优于两种语言.
来自Erlang的并发编程(pdf) (幻灯片)(2003):
我们观察到创建Erlang进程所需的时间是1μs到2,500个进程; 此后,对于多达30,000个过程,它增加到大约3μs.Java和C#的性能显示在图的顶部.对于少量过程,创建过程大约需要300μs.创建两千多个流程是不可能的.
我们看到,对于多达30,000个进程,在两个Erlang进程之间发送消息的时间约为0.8μs.对于C#,每个消息大约需要50μs,直到最大进程数(大约1800个进程).Java更糟糕的是,对于多达100个进程,每个消息花了大约50μs,此后当大约有1000个Java进程时,它每个消息迅速增加到10ms.
我并不完全理解为什么Erlang进程在产生新进程方面更有效率,并且每个进程的内存占用量更小.OS和Erlang VM都必须进行调度,上下文切换,并跟踪寄存器中的值等等......
为什么OS线程的实现方式与Erlang中的进程不同?他们还需要支持更多的东西吗?为什么他们需要更大的内存占用?为什么他们的产卵和沟通较慢?
从技术上讲,为什么在产生和通信时,Erlang中的进程比OS线程更有效?为什么操作系统中的线程不能以同样有效的方式实现和管理?为什么操作系统线程的内存占用量更大,产生和通信速度更慢?
据我所知,虚拟机分为两类:"系统虚拟机"或"进程虚拟机".BEAM所在的地方对我来说有点模糊.还有其他一种我不知道的虚拟机吗?
爱立信编写和编译的Erlang和Erlang/OTP的实现是什么?是汇编,C还是Erlang本身?
更新1:感谢DrJokepu.如果我理解正确,Erlang source-to-VM编译器是用Erlang本身编写的.但VM是用C语言编写的.
更新2:Hynek-Pichi-Vychodil指出了很多细节.
最近我一直在用docker compose进行一些实验,以便部署多个协作微服务.我可以看到微服务提供的许多好处,现在有一个很好的工具集来管理它们,我认为跳进微服务车并不是很难.
但是,我也一直在尝试Elixir,我非常喜欢它本身提供的好处.鉴于它鼓励将代码打包到多个解耦的应用程序中,并支持热代码升级,您如何将docker与elixir(或erlang)混合使用?
例如,如果我想使用docker因为它提供了dev-prod奇偶校验,那么elixir如何适应它?鉴于docker容器是不可变的,我失去了进行热代码升级的能力,对吗?蓝/绿部署或金丝雀发布怎么样?
我的意思是,我可以用Elixir编写微服务并使用它们就像用任何其他语言编写的那样,多语言无论如何都是微服务的好处之一,但是后来我没有得到使用OTP平台的全部好处,我猜测纯粹的协作erlang应用程序比使用中间队列在以不同(或非)语言编写的微服务之间进行通信更为优化.
许多程序使用如下命令返回其版本号:
$ program --version
program (platform info) v1.2.3
Run Code Online (Sandbox Code Playgroud)
这对于编写程序的安装或维护脚本以及系统管理员和朋友的一些其他受控自动化魔法非常有用.
如何轻松获取Erlang(OTP)的版本号?
以下是一些令人不满意的解决方案([1]和其他教程/ Erlang文档):
模拟器
$ erl
1> erlang:system_info(otp_release).
"R13B03"
Run Code Online (Sandbox Code Playgroud)
难以编写脚本.我还没有找到erl从shell提示符执行单个命令的方法.
发布文件
$ cat /usr/lib/erlang/releases/RELEASES
[{release,"OTP APN 181 01","R13B03","5.7.4",
[{kernel,"2.13.4","/usr/lib/erlang/lib/kernel-2.13.4"},
{stdlib,"1.16.4","/usr/lib/erlang/lib/stdlib-1.16.4"},
{sasl,"2.1.8","/usr/lib/erlang/lib/sasl-2.1.8"}],
permanent}].
Run Code Online (Sandbox Code Playgroud)
解析天堂(带壳).
另一种方法也可以是检查安装路径,但这不是可移植的(我的安装路径不包括版本).
个人情境:我正在编写一个脚本,在几台机器上安装相同版本的RabbitMQ插件.有些插件对OTP版本的要求很低,这就是问题的起源.
这个问题是在Beam VM及其提供的功能的背景下,而不是图灵完整语言可以做的一般上下文.我想投入一些时间来学习纯Erlang或Elixir.我得到了两者之间的基本差异,因为宏语,更好的语法和更快的语言开发,我倾向于Elixir.
我的问题是:如果我选择Elixir,我会偶然发现我不能做的事情,但可以在Erlang中做些什么吗?我可以使用Elix的所有OTP内容,所有Erlang库,代码重新加载等吗?
我不是要求两者之间的偏好; 关于语言可能性的事实.优选地来自在生产中使用两者的人.
我最近一直在关注akka,这令人印象深刻.看起来它具有erlang的大部分杀手级功能 - 位置透明度,监督层次结构等等.有没有任何功能erlang有akka没有?
erlang ×10
elixir ×3
akka ×1
architecture ×1
beam ×1
c ×1
case-study ×1
docker ×1
erlang-otp ×1
haskell ×1
performance ×1
python ×1
shell ×1