目前正在将erlang应用程序从版本17转换为18.可伸缩性和性能是设计中的主要指令.该程序需要一种方法来区分和排序新输入,或者使用许多独特的单调递增数字(连续的数据流)或其他一些机制.当前版本(17)没有使用now(),因为它是一个可伸缩性瓶颈(全局锁定),所以它是通过读取时钟和做其他事情来为进入的数据生成标记.我是试图找出在18年做到这一点的最好方法,并从我运行的测试中得到一些有趣的结果.
我期望erlang:unique_integer([monotonic])得到不好的结果,因为我希望它有像now()这样的全局锁.假设可以并行读取时钟,我期望其中一个时钟功能具有最佳结果.相反,erlang:unique_integer([monotonic])从我基准测试的所有函数中获得最佳结果,并且时钟函数更糟糕.
有人可以解释结果,告诉我哪些erlang函数应该给出最好的结果,以及哪些东西(时钟,数字生成器等)是否全局锁定在18?此外,如果您发现我的测试方法存在任何问题,请务必指出它们.
测试平台/方法
windows 7 64 bit
erlang otp 18 (x64)
2 intel cores (celeron 1.8GHz)
2 erlang processes spawned to run each test function concurrently 500000 times
for a total of 1000000 times, timed with timer:tc
each test run 10 times in succession and all results recorded
Run Code Online (Sandbox Code Playgroud)
BASELINE TEST,SEQENTIAL
erlang:unique_integer([monotonic])
47000-94000
Run Code Online (Sandbox Code Playgroud)
平行时代
erlang:unique_integer([monotonic])
~94000
ets:update_counter
450000-480000
erlang:monotonic_time
202000-218000
erlang:system_time
218000-234000
os:system_time
124000-141000
calendar:universal_time
453000-530000
Run Code Online (Sandbox Code Playgroud) 刚从vi来到Emacs.
我想将键盘顶部的所有数字重新绑定到它们的移位对应物(即1个映射到!,2个映射到@等),同时将数字键盘数字保持为简单的数字.
我重新编写数字就好了,键盘顶部的数字正确映射到符号; 但是,这也将键盘数字映射到符号.作为回应,我试图将键盘数字重新重新映射回数字,但这是不成功的 - 它们仍然是符号.
当我使用vi时,这很容易实现,但我更愿意继续使用Emacs.有人有解决方案吗?
示例.emacs:
(global-set-key "1" "!")
; etc...
(global-set-key [kp-1] "1")
; etc...
Run Code Online (Sandbox Code Playgroud) 4> abs(1).
1
5> X = abs.
abs
6> X(1).
** exception error: bad function abs
7> erlang:X(1).
1
8>
Run Code Online (Sandbox Code Playgroud)
当我用变量调用函数时,是否有任何特殊原因需要使用模块名称?这对我来说不起作用,因为,有一件事,它只是太多的句法垃圾,让我的眼睛流血.另一方面,我计划从列表中调用函数,例如(在我的头顶):
[X(1) || X <- [abs, f1, f2, f3...]].
Run Code Online (Sandbox Code Playgroud)
试图在这里使用各种模块名称会使冗长度达到顶峰,而我所做的全部工作就是减少冗长.
编辑:看这里:http://www.erlangpatterns.org/chain.html这家伙已经取得了一些管道功能.他按照我想要的方式调用函数,但是当我尝试使用它时,他的代码不起作用.但据我所知,这个人是一位经验丰富的Erlang程序员 - 我看到他在会议上发表了一些主题演讲或其他内容(我在网上看到了).
这种东西过去是否有用但不再适用?当然有一种方法可以做我想做的事 - 调用这些函数而不需要冗长和样板.
编辑:如果我正确阅读文档,似乎暗示我的顶部示例应该工作(第8.6节)http://erlang.org/doc/reference_manual/expressions.html
我不知道Haskell,我只想玩它来学习它.我试图理解io,monads等,并在解释器(GHCi,版本7.10.2,WinGHCI)中写了这个:
Prelude> [1,1] >> "ok"
"okok"
Prelude> [1,1,1] >> "ok"
"okokok"
Prelude> [1..10] >> "ok"
"okokokokokokokokokok"
Prelude> [1] >> "ok" >> [1] >> "ok"
"okok"
Prelude> [1,2] >> "ok" >> [1,2] >> "ok"
"okokokokokokokok"
Prelude> [1..10] >> [1..10]
[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)
小心解释一下?为什么列表中的元素数量会影响写入"ok"的次数(或者在最后一种情况下,是否写入数组的次数)?>>运算符不应该这样做,是吗?
erlang ×2
benchmarking ×1
concurrency ×1
emacs ×1
haskell ×1
list ×1
monads ×1
performance ×1
time ×1