- 浏览: 333654 次
- 性别:
- 来自: 北京
最新评论
-
perfect_control:
真的很详细,一些东西很容易被我忽略掉了
使用fprof进行性能分析 -
leeyisoft:
http://www.erlangqa.com/ 怎么变成 “ ...
Erlang问答网站,欢迎各位提出问题,解答问题。 -
simsunny22:
4年之后我才看到 慢慢的干货
Erlang服务器内存耗尽bug跟踪过程 -
爱死我:
...
使用etop查看系统中进程信息 -
宋兵甲:
在跑这个服务的时候,每秒建立一个客户端连接,连续建立10000 ...
自己写一个tcp 通用服务器
就喜欢看这样的东西...
This is so juicy I couldn’t resist blogging about it. 37Signals sysadmin and my good friend Mark Imbriaco replaced the Campfire chat room handler, originally written in C, with an Erlang version. The results?
283. As in 283 lines of Erlang code in toto.
1500. The Erlang poller handles 1200 - 1500 requests per second.
2.8. Average request time in milliseconds.
240. Number of requests, in millions, served since it went into production last friday.
恩,和我遇到的情况差不多呵呵.
几百行代码,分布式架构,几十K/s请求,没有内存泄漏,系统长久运行...
原文:
http://www.37signals.com/svn/posts/1728-nuts-bolts-campfire-loves-erlang
http://weblog.hypotheticalabs.com/?p=490
这个算法若不考虑通讯开销,最快是O(nlogn)的.只会慢不会快.
不是啊,能达到 O(sqrt(n)) 的
并行算法的一个前提条件是假定处理器数量固定.假定你现在4个处理器
1 2 | 3 4 | 5 6 | 7 8|9 10|11 12|13 14| 15 16
1 3 | 3 7 | 5 11 | 7 15|9 19|11 23|13 27| 15 31 8/4
1 3 6 10 | 5 11 18 26|9 19 30 33|13 27 42 58 8/4
1 3 6 10 15 21 28 36|9 19 30 33 46 60 75 71 8/4
1 3 6 10 15 21 28 36 9 19 30 33 46 60 75 71 8/4
你的算法是这样的?
刚才说错了复杂度应该是O(nlogn/p)
只有当处理器数目和元素数目相等时,才能跑到O(logn)
当然一般的情况下,元素数目远大于处理器数目
这个算法若不考虑通讯开销,最快是O(nlogn)的.只会慢不会快.
不是啊,p == sqrt(2n) 时,能达到 O(sqrt(n)) 的
这个算法若不考虑通讯开销,最快是O(nlogn)的.只会慢不会快.
赞一个,计算机设计就是一个主要的原因就是合理利用IO,从cpu的缓存,到内存,操作系统级别的缓存,应用级别的缓存,硬盘级别的缓存,无一不是用来提高IO的。合理的IO也需要合理的锁设计,要不成单线程了,最坏的就是死锁。
个人感觉: 现在cpu是很快了,除了视频编解码和图像处理外外,其他应用主要是IO处理上跟不上,不在cpu的处理能力上
当幂充分大的时候,这个幂起码可以分成4个通道来做.
从复杂度上来说,可以是1/4的.当然从数量及来说,是不可能降的更低了.
比如Axum理论上的CPU是无限的,因为可以通过网络扩展。
这不一定,选对了算法javascrpit都会比C快.
首先,单线程的尾递归也好循环也好,最快也是O(n)的,而且无法并行运算.
但是吧fib(n)转换为
0 1
1 1
矩阵的n次幂,那么就可以并行计算,而且不光是并行计算,本身的单线程算法就可以从循环的o(n)下降为o(log(n)).
如果都是矩阵乘,那么 C 的单线程算法还是能打翻很多虚拟机语言的多核算法……
矩阵与矩阵比
矩阵与递归比
矩阵与并行矩阵乘比
你说的是那个?
这不一定,选对了算法javascrpit都会比C快.
首先,单线程的尾递归也好循环也好,最快也是O(n)的,而且无法并行运算.
但是吧fib(n)转换为
0 1
1 1
矩阵的n次幂,那么就可以并行计算,而且不光是并行计算,本身的单线程算法就可以从循环的o(n)下降为o(log(n)).
如果都是矩阵乘,那么 C 的单线程算法还是能打翻很多虚拟机语言的多核算法……
这不一定,选对了算法javascrpit都会比C快.
首先,单线程的尾递归也好循环也好,最快也是O(n)的,而且无法并行运算.
但是吧fib(n)转换为
0 1
1 1
矩阵的n次幂,那么就可以并行计算,而且不光是并行计算,本身的单线程算法就可以从循环的o(n)下降为o(log(n)).
这个好, 这是我看的一本薄 algorithms 书中第一章章末的一道习题 提到用matrix来算fib。
This is so juicy I couldn’t resist blogging about it. 37Signals sysadmin and my good friend Mark Imbriaco replaced the Campfire chat room handler, originally written in C, with an Erlang version. The results?
283. As in 283 lines of Erlang code in toto.
1500. The Erlang poller handles 1200 - 1500 requests per second.
2.8. Average request time in milliseconds.
240. Number of requests, in millions, served since it went into production last friday.
恩,和我遇到的情况差不多呵呵.
几百行代码,分布式架构,几十K/s请求,没有内存泄漏,系统长久运行...
原文:
http://www.37signals.com/svn/posts/1728-nuts-bolts-campfire-loves-erlang
http://weblog.hypotheticalabs.com/?p=490
评论
41 楼
jigloo
2009-09-22
因为要做n(n+1)/2次加法,所以按n(n+1)/2p来分配任务。
40 楼
Trustno1
2009-09-03
<div class="quote_title">night_stalker 写道</div>
<div class="quote_div">
<p>排版好痛苦…… 改了好几遍</p>
<p>这样应该清晰? 设有 4 个处理器。(p=4)</p>
<p> </p>
<p><span style="font-family: courier new,courier;">1 2 | 3 4 | 5 6 | 7 8 运算次数 / 本轮用到的处理器个数</span></p>
<p><span style="font-family: courier new,courier;"><br>第一步:块内向前和<br>1 <span style="color: #ff0000;">3</span> | 3 <span style="color: #ff0000;">7</span> | 5 <span style="color: #ff0000;">11</span> | 7 <span style="color: #ff0000;">15</span> 1 / 4 </span></p>
<p> </p>
<p>第二步:块外向前和<span style="font-family: courier new,courier;">(结果存于前一块的最后一个元素)<br>1 3 <br> 3 <span style="color: #ff0000;">10</span> 1 / 1 (10 = 3+7)<br> 5 <span style="color: #ff0000;">21 <span style="color: #000000;">1 / 1 (21 = 10+11)</span></span> <br> 7 <span style="color: #ff0000;">36</span> 1 / 1 (36 = 21+15)<br></span></p>
<p> </p>
<p>第三步:内外向前和相加<span style="font-family: courier new,courier;"><br>1 3 | <span style="color: #ff0000;">6</span> 10 | <span style="color: #ff0000;">15</span> 21 | <span style="color: #ff0000;">28</span> 36 1 / 3</span></p>
<p> </p>
<p>既然处理器数量是小小的常数,O(2n/p + p) = O(n/2) = O(n),怎么弄都是 O(n) ……</p>
</div>
<p>这个算法串行仍然是O(nLogn)的,很简单每一步都需要n/2,总共需要logn步。</p>
<p>只有当处理器达到log2n时,才可能是O(n)的,即可以在n/2内完成,但是再多的处理器也只能比串行算法快一半.比如你处理100万个元素,需要将近20个处理器才能比串行算法快一半.</p>
<p>其实,这个算法可以在串行时就达到O(n).并行时可以达到O(n/p).</p>
<p> </p>
<div class="quote_div">
<p>排版好痛苦…… 改了好几遍</p>
<p>这样应该清晰? 设有 4 个处理器。(p=4)</p>
<p> </p>
<p><span style="font-family: courier new,courier;">1 2 | 3 4 | 5 6 | 7 8 运算次数 / 本轮用到的处理器个数</span></p>
<p><span style="font-family: courier new,courier;"><br>第一步:块内向前和<br>1 <span style="color: #ff0000;">3</span> | 3 <span style="color: #ff0000;">7</span> | 5 <span style="color: #ff0000;">11</span> | 7 <span style="color: #ff0000;">15</span> 1 / 4 </span></p>
<p> </p>
<p>第二步:块外向前和<span style="font-family: courier new,courier;">(结果存于前一块的最后一个元素)<br>1 3 <br> 3 <span style="color: #ff0000;">10</span> 1 / 1 (10 = 3+7)<br> 5 <span style="color: #ff0000;">21 <span style="color: #000000;">1 / 1 (21 = 10+11)</span></span> <br> 7 <span style="color: #ff0000;">36</span> 1 / 1 (36 = 21+15)<br></span></p>
<p> </p>
<p>第三步:内外向前和相加<span style="font-family: courier new,courier;"><br>1 3 | <span style="color: #ff0000;">6</span> 10 | <span style="color: #ff0000;">15</span> 21 | <span style="color: #ff0000;">28</span> 36 1 / 3</span></p>
<p> </p>
<p>既然处理器数量是小小的常数,O(2n/p + p) = O(n/2) = O(n),怎么弄都是 O(n) ……</p>
</div>
<p>这个算法串行仍然是O(nLogn)的,很简单每一步都需要n/2,总共需要logn步。</p>
<p>只有当处理器达到log2n时,才可能是O(n)的,即可以在n/2内完成,但是再多的处理器也只能比串行算法快一半.比如你处理100万个元素,需要将近20个处理器才能比串行算法快一半.</p>
<p>其实,这个算法可以在串行时就达到O(n).并行时可以达到O(n/p).</p>
<p> </p>
39 楼
DraculaW
2009-05-19
根据同学说的 xiaonei现在也转向Erlang了
38 楼
Trustno1
2009-05-19
其实加速的方法是比较经典的算法.可以往这方面考虑
另外,还可以加一个两个限制条件,就不那么简单了.
1.数组中的某些随机数可能太小,因此我们可以设一个阈值k,使得前向加前的所有元素都大于k
2.再进一步元素的值也不能过大,设一阈值l,使得前向加前的所有元素都在k和l之间.
另外,还可以加一个两个限制条件,就不那么简单了.
1.数组中的某些随机数可能太小,因此我们可以设一个阈值k,使得前向加前的所有元素都大于k
2.再进一步元素的值也不能过大,设一阈值l,使得前向加前的所有元素都在k和l之间.
37 楼
night_stalker
2009-05-19
<p>假定现在4个处理器<br><br><span style="font-family: courier new,courier;">1 2 3 4 | 5 6 7 8 | 9 10 11 12 | 13 14 15 16 总运算/处理器个数<br></span></p>
<p><span style="font-family: courier new,courier;">1 <span style="color: #ff0000;">3 6 10</span> | 5 <span style="color: #ff0000;">11</span></span><span style="font-family: courier new,courier;"><span style="color: #ff0000;"> 18 26</span> | 9 <span style="color: #ff0000;">19 30 42</span> | 13 <span style="color: #ff0000;">27 42 58 <span style="color: #0000ff;">12/4</span><br></span></span></p>
<p><span style="font-family: courier new,courier;">1 3 6 10 | 5 11</span><span style="font-family: courier new,courier;"> 18 <span style="color: #ff0000;">36</span> | 9 19 30 <span style="color: #ff0000;">78</span> | 13 27 42 <span style="color: #ff0000;">136 <span style="color: #0000ff;">3/1</span><br></span></span></p>
<p><span style="font-family: courier new,courier;">1 3 6 10 | <span style="color: #ff0000;">15 21</span></span><span style="font-family: courier new,courier;"><span style="color: #ff0000;"> 28</span> 36 | <span style="color: #ff0000;">45 55 66</span> 78 | <span style="color: #ff0000;">91 105 120</span> 136 <span style="color: #0000ff;">9/3</span></span></p>
<p> </p>
<p>第二步等价于 大小为4(分块数)的数组向前和问题,既然处理器数量是常数,那么就可以常数时间解决,并不是 bottle neck。</p>
<p><span style="font-family: courier new,courier;">1 <span style="color: #ff0000;">3 6 10</span> | 5 <span style="color: #ff0000;">11</span></span><span style="font-family: courier new,courier;"><span style="color: #ff0000;"> 18 26</span> | 9 <span style="color: #ff0000;">19 30 42</span> | 13 <span style="color: #ff0000;">27 42 58 <span style="color: #0000ff;">12/4</span><br></span></span></p>
<p><span style="font-family: courier new,courier;">1 3 6 10 | 5 11</span><span style="font-family: courier new,courier;"> 18 <span style="color: #ff0000;">36</span> | 9 19 30 <span style="color: #ff0000;">78</span> | 13 27 42 <span style="color: #ff0000;">136 <span style="color: #0000ff;">3/1</span><br></span></span></p>
<p><span style="font-family: courier new,courier;">1 3 6 10 | <span style="color: #ff0000;">15 21</span></span><span style="font-family: courier new,courier;"><span style="color: #ff0000;"> 28</span> 36 | <span style="color: #ff0000;">45 55 66</span> 78 | <span style="color: #ff0000;">91 105 120</span> 136 <span style="color: #0000ff;">9/3</span></span></p>
<p> </p>
<p>第二步等价于 大小为4(分块数)的数组向前和问题,既然处理器数量是常数,那么就可以常数时间解决,并不是 bottle neck。</p>
36 楼
Trustno1
2009-05-19
第一步 n/2p
第二步 n/2-1 (bottle neck)
第三步 (n-1)/2p
n/2p+n/2+(n-1)/2p
按照比单线程算法快的要求,的确已经不错了,不过speed up不可能高于50%.意味着你无论加多少cpu都不会快过单线程算法的一半.
第二步 n/2-1 (bottle neck)
第三步 (n-1)/2p
n/2p+n/2+(n-1)/2p
按照比单线程算法快的要求,的确已经不错了,不过speed up不可能高于50%.意味着你无论加多少cpu都不会快过单线程算法的一半.
35 楼
night_stalker
2009-05-19
<p>排版好痛苦…… 改了好几遍</p>
<p>这样应该清晰? 设有 4 个处理器。(p=4)</p>
<p> </p>
<p><span style="font-family: courier new,courier;">1 2 | 3 4 | 5 6 | 7 8 运算次数 / 本轮用到的处理器个数</span></p>
<p><span style="font-family: courier new,courier;"><br>第一步:块内向前和<br>1 <span style="color: #ff0000;">3</span> | 3 <span style="color: #ff0000;">7</span> | 5 <span style="color: #ff0000;">11</span> | 7 <span style="color: #ff0000;">15</span> 1 / 4 </span></p>
<p> </p>
<p>第二步:块外向前和<span style="font-family: courier new,courier;">(结果存于前一块的最后一个元素)<br>1 3 <br> 3 <span style="color: #ff0000;">10</span> 1 / 1 (10 = 3+7)<br> 5 <span style="color: #ff0000;">21 <span style="color: #000000;">1 / 1 (21 = 10+11)</span></span> <br> 7 <span style="color: #ff0000;">36</span> 1 / 1 (36 = 21+15)<br></span></p>
<p> </p>
<p>第三步:内外向前和相加<span style="font-family: courier new,courier;"><br>1 3 | <span style="color: #ff0000;">6</span> 10 | <span style="color: #ff0000;">15</span> 21 | <span style="color: #ff0000;">28</span> 36 1 / 3</span></p>
<p> </p>
<p>既然处理器数量是小小的常数,O(2n/p + p) = O(n/2) = O(n),怎么弄都是 O(n) ……</p>
<p>这样应该清晰? 设有 4 个处理器。(p=4)</p>
<p> </p>
<p><span style="font-family: courier new,courier;">1 2 | 3 4 | 5 6 | 7 8 运算次数 / 本轮用到的处理器个数</span></p>
<p><span style="font-family: courier new,courier;"><br>第一步:块内向前和<br>1 <span style="color: #ff0000;">3</span> | 3 <span style="color: #ff0000;">7</span> | 5 <span style="color: #ff0000;">11</span> | 7 <span style="color: #ff0000;">15</span> 1 / 4 </span></p>
<p> </p>
<p>第二步:块外向前和<span style="font-family: courier new,courier;">(结果存于前一块的最后一个元素)<br>1 3 <br> 3 <span style="color: #ff0000;">10</span> 1 / 1 (10 = 3+7)<br> 5 <span style="color: #ff0000;">21 <span style="color: #000000;">1 / 1 (21 = 10+11)</span></span> <br> 7 <span style="color: #ff0000;">36</span> 1 / 1 (36 = 21+15)<br></span></p>
<p> </p>
<p>第三步:内外向前和相加<span style="font-family: courier new,courier;"><br>1 3 | <span style="color: #ff0000;">6</span> 10 | <span style="color: #ff0000;">15</span> 21 | <span style="color: #ff0000;">28</span> 36 1 / 3</span></p>
<p> </p>
<p>既然处理器数量是小小的常数,O(2n/p + p) = O(n/2) = O(n),怎么弄都是 O(n) ……</p>
34 楼
Trustno1
2009-05-19
night_stalker 写道
Trustno1 写道
引用
p > 1 时
1.由于 n 很大,先均匀分 p 块,求 块内向前和,耗时 n/p
2.再求 块外向前和,耗时不超过 p
3.最后把 块内向前和 与 块外向前和 加起来,耗时 n/p
1.由于 n 很大,先均匀分 p 块,求 块内向前和,耗时 n/p
2.再求 块外向前和,耗时不超过 p
3.最后把 块内向前和 与 块外向前和 加起来,耗时 n/p
这个算法若不考虑通讯开销,最快是O(nlogn)的.只会慢不会快.
不是啊,能达到 O(sqrt(n)) 的
并行算法的一个前提条件是假定处理器数量固定.假定你现在4个处理器
1 2 | 3 4 | 5 6 | 7 8|9 10|11 12|13 14| 15 16
1 3 | 3 7 | 5 11 | 7 15|9 19|11 23|13 27| 15 31 8/4
1 3 6 10 | 5 11 18 26|9 19 30 33|13 27 42 58 8/4
1 3 6 10 15 21 28 36|9 19 30 33 46 60 75 71 8/4
1 3 6 10 15 21 28 36 9 19 30 33 46 60 75 71 8/4
你的算法是这样的?
刚才说错了复杂度应该是O(nlogn/p)
只有当处理器数目和元素数目相等时,才能跑到O(logn)
当然一般的情况下,元素数目远大于处理器数目
33 楼
night_stalker
2009-05-19
Trustno1 写道
引用
p > 1 时
1.由于 n 很大,先均匀分 p 块,求 块内向前和,耗时 n/p
2.再求 块外向前和,耗时不超过 p
3.最后把 块内向前和 与 块外向前和 加起来,耗时 n/p
1.由于 n 很大,先均匀分 p 块,求 块内向前和,耗时 n/p
2.再求 块外向前和,耗时不超过 p
3.最后把 块内向前和 与 块外向前和 加起来,耗时 n/p
这个算法若不考虑通讯开销,最快是O(nlogn)的.只会慢不会快.
不是啊,p == sqrt(2n) 时,能达到 O(sqrt(n)) 的
32 楼
Trustno1
2009-05-19
引用
p > 1 时
1.由于 n 很大,先均匀分 p 块,求 块内向前和,耗时 n/p
2.再求 块外向前和,耗时不超过 p
3.最后把 块内向前和 与 块外向前和 加起来,耗时 n/p
1.由于 n 很大,先均匀分 p 块,求 块内向前和,耗时 n/p
2.再求 块外向前和,耗时不超过 p
3.最后把 块内向前和 与 块外向前和 加起来,耗时 n/p
这个算法若不考虑通讯开销,最快是O(nlogn)的.只会慢不会快.
31 楼
night_stalker
2009-05-19
p 处理器 求 大小为 n 的数组 的向前和:
p == 1 时
做 n-1 次加法,耗时 n
p > 1 时
1.由于 n 很大,先均匀分 p 块,求 块内向前和,耗时 n/p
2.再求 块外向前和,耗时不超过 p
3.最后把 块内向前和 与 块外向前和 加起来,耗时 n/p
最后是 2n/p + p
处理器数目巨大时,第 2 步耗时可以更少,设为 f(p),由 f(n) 和 f(p) 的关系列出方程,选择适当的 p 可以求得 f 最小值……
既然题目说数组巨大,那么相比之下处理器数目不巨大,就不考虑了 ……
-----------------
处理器充分多时,求 n 个数的和,可以用二叉把耗时降低至 log(n)/log(2),不过“向前和”貌似有点不一样 -_-
p == 1 时
做 n-1 次加法,耗时 n
p > 1 时
1.由于 n 很大,先均匀分 p 块,求 块内向前和,耗时 n/p
2.再求 块外向前和,耗时不超过 p
3.最后把 块内向前和 与 块外向前和 加起来,耗时 n/p
最后是 2n/p + p
处理器数目巨大时,第 2 步耗时可以更少,设为 f(p),由 f(n) 和 f(p) 的关系列出方程,选择适当的 p 可以求得 f 最小值……
既然题目说数组巨大,那么相比之下处理器数目不巨大,就不考虑了 ……
-----------------
处理器充分多时,求 n 个数的和,可以用二叉把耗时降低至 log(n)/log(2),不过“向前和”貌似有点不一样 -_-
30 楼
Trustno1
2009-05-19
再出一个并行算法的题.
有一个庞大的数组,数组每一个元素都是随机数,现在求这个数组每一个元素的前向和,即p[n]=p[1]+....+p[n-1].要求算法的复杂度小于单线程最快算法的复杂度.
有一个庞大的数组,数组每一个元素都是随机数,现在求这个数组每一个元素的前向和,即p[n]=p[1]+....+p[n-1].要求算法的复杂度小于单线程最快算法的复杂度.
29 楼
everlasting_188
2009-05-18
night_stalker 写道
比 fib 速度请用 C,循环用 goto。C 写的单线程算法就打翻 VM 语言好多个核了。
不过聊天室的 concurrency 和 parallel 真的没什么联系……
瓶颈不在 cpu,在 io 和锁。所以 C 算得快也没多大帮助。
不过聊天室的 concurrency 和 parallel 真的没什么联系……
瓶颈不在 cpu,在 io 和锁。所以 C 算得快也没多大帮助。
赞一个,计算机设计就是一个主要的原因就是合理利用IO,从cpu的缓存,到内存,操作系统级别的缓存,应用级别的缓存,硬盘级别的缓存,无一不是用来提高IO的。合理的IO也需要合理的锁设计,要不成单线程了,最坏的就是死锁。
个人感觉: 现在cpu是很快了,除了视频编解码和图像处理外外,其他应用主要是IO处理上跟不上,不在cpu的处理能力上
28 楼
neora
2009-05-17
Chat Room无疑是ERLANG的强项了。
27 楼
Trustno1
2009-05-16
night_stalker 写道
单线程矩阵乘 和 并行矩阵乘比。
只要 cpu 的个数有限,仅仅改成并行不能降低算法复杂度。
只要 cpu 的个数有限,仅仅改成并行不能降低算法复杂度。
当幂充分大的时候,这个幂起码可以分成4个通道来做.
从复杂度上来说,可以是1/4的.当然从数量及来说,是不可能降的更低了.
26 楼
ray_linn
2009-05-16
night_stalker 写道
单线程矩阵乘 和 并行矩阵乘比。
只要 cpu 的个数有限,仅仅改成并行不能降低算法复杂度。
只要 cpu 的个数有限,仅仅改成并行不能降低算法复杂度。
比如Axum理论上的CPU是无限的,因为可以通过网络扩展。
25 楼
night_stalker
2009-05-16
单线程矩阵乘 和 并行矩阵乘比。
只要 cpu 的个数有限,仅仅改成并行不能降低算法复杂度。
只要 cpu 的个数有限,仅仅改成并行不能降低算法复杂度。
24 楼
Trustno1
2009-05-16
night_stalker 写道
Trustno1 写道
这不一定,选对了算法javascrpit都会比C快.
首先,单线程的尾递归也好循环也好,最快也是O(n)的,而且无法并行运算.
但是吧fib(n)转换为
0 1
1 1
矩阵的n次幂,那么就可以并行计算,而且不光是并行计算,本身的单线程算法就可以从循环的o(n)下降为o(log(n)).
如果都是矩阵乘,那么 C 的单线程算法还是能打翻很多虚拟机语言的多核算法……
矩阵与矩阵比
矩阵与递归比
矩阵与并行矩阵乘比
你说的是那个?
23 楼
night_stalker
2009-05-16
Trustno1 写道
这不一定,选对了算法javascrpit都会比C快.
首先,单线程的尾递归也好循环也好,最快也是O(n)的,而且无法并行运算.
但是吧fib(n)转换为
0 1
1 1
矩阵的n次幂,那么就可以并行计算,而且不光是并行计算,本身的单线程算法就可以从循环的o(n)下降为o(log(n)).
如果都是矩阵乘,那么 C 的单线程算法还是能打翻很多虚拟机语言的多核算法……
22 楼
mathgl
2009-05-16
Trustno1 写道
night_stalker 写道
比 fib 速度请用 C,循环用 goto。C 写的单线程算法就打翻 VM 语言好多个核了。
这不一定,选对了算法javascrpit都会比C快.
首先,单线程的尾递归也好循环也好,最快也是O(n)的,而且无法并行运算.
但是吧fib(n)转换为
0 1
1 1
矩阵的n次幂,那么就可以并行计算,而且不光是并行计算,本身的单线程算法就可以从循环的o(n)下降为o(log(n)).
这个好, 这是我看的一本薄 algorithms 书中第一章章末的一道习题 提到用matrix来算fib。
发表评论
-
Erlang问答网站,欢迎各位提出问题,解答问题。
2012-03-18 15:07 5240平时收到很多关于Erlang的问题,我都尽量一一解答,可是时间 ... -
Emakefile并行编译
2011-11-17 13:15 7610项目代码越来越多,使用erlang编译也越来越慢。无论是Mak ... -
Erlang服务器内存耗尽bug跟踪过程
2011-10-25 21:44 21738本文描述朋友Erlang服务器内存耗尽bug的解决过程 ... -
inet:getstat/2小用法
2011-04-27 09:32 4550inet:getstat/2的用处 在 ... -
Erlang游戏开发-协议
2011-04-22 16:10 10684Erlang游戏开发-协议 ... -
Gearman Erlang Client
2010-10-17 21:14 3684Gearman Gearman是一个通用的任务调度框架。 ... -
ECUG归来
2010-10-17 21:02 2945今天ECUG V圆满结束了,不知不觉作为讲师已经参加过3次大会 ... -
gen-erl-app快速生成erlang app 框架
2010-04-07 14:22 3957经常需要创建各种erlang app,这个过程一旦掌握,就很繁 ... -
erl-redis发布
2010-03-30 11:44 5764最近几天因为需要,实现了一个redis erlang clie ... -
用Erlang做了很多事
2010-01-19 14:08 5048因为工作及时间关系,最近比较忙碌,没有太多的时间写文章。 ... -
ecug topic - erlang开发实践
2009-11-11 10:04 3722从ecug归来,感觉不错,大家学习探讨的积极性很高哦。 很高 ... -
reltool用户指南
2009-11-02 22:27 6309说明,最近比较忙,没有太多时间更新blog,请各位朋友谅解. ... -
Erlang定时任务server (仿crontab语法)
2009-09-23 18:03 6305好久不写blog了,看到yufeng老大那么活跃,我也“耐不住 ... -
Erlang进程之错?
2009-07-27 15:06 3662前阵子erlang-china关于erla ... -
CNode指南
2009-07-27 14:13 3293好久不发文章,因为工作太忙。这个东西就凑凑数吧。各位见谅。 ... -
Erlang类型及函数声明规格
2009-06-08 22:41 9493Erlang类型及函数声明 ... -
使用etop查看系统中进程信息
2009-05-29 13:57 6108Erlang提供了丰富的开发工具,你认为没有的时候,很可能是你 ... -
创建gen_server组解决单process瓶颈
2009-05-27 17:05 5223并发和顺序是一个令人 ... -
list random shuffle实现
2009-05-07 13:41 4324在项目中需要对list进行随机shuffle,但是在erlan ... -
Erlang开发建议(杂记版)
2009-04-24 18:27 6451以下是在erlang项目开发中的一些记录,即包含很多通俗易懂的 ...
相关推荐
Erlang入门:构建application练习3,实例演示如果构建一个最简单的Erlang Application
Erlang入门:构建application练习5(监督树),以实例完全演示监督树的用法,Erlang入门必须知道的那点事
编写分布式的Erlang程序:陷阱和对策
Erlang入门:构建application练习4(进程link的作用),实例演示进程link的作用及效果
erlang文献及资料汇总 入门资料: erlang中文手册(R11B 文档译文,最适合入门) erlang位运算与二进制解析 erlang二进制高效编程 erlang异常处理详解 开发经验: 面对软件错误构建可靠的分布式系统 编写分布式的 ...
《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF
孟岩谈Erlang:并行计算和云计算,详细介绍了新一代编程语言Erlang在并行计算和云计算方面的特性
erlang最新 api
主要介绍了Erlang初学:Erlang的一些特点和个人理解总结,本文总结了函数式编程、一切都是常量、轻量进程、进程端口映射及典型缺点等内容,需要的朋友可以参考下
This package contains the Erlang/OTP runtime implementation, which is configured and built with HiPE support (allows compiling to native code), and minimal set of Erlang applications: compiler - ...
win64位系统 。 erlang24.2.2。
Erlang特性: ● 并发性 - Erlang支持超大量级的并发进程,并且不需要操作系统具有并发机制。 ● 分布式 - 一个分布式Erlang系统是多个Erlang节点组成的网络(通常每个处理器被作为一个节点) ● 健壮性 - Erlang...
Introducing Erlang: Getting Started in Functional Programming by Simon St. Laurent English | 6 Mar. 2017 | ASIN: B06XHSP5SH | 212 Pages | AZW3 | 1.85 MB If you’re new to Erlang, its functional style...
Programming+Erlang.pdf+ 面对软件错误构建可靠的分布式系统.pdf+ Concurrent Programming in ERLANG
confetti, Erlang配置提供程序/应用程序 纸屑五彩纸屑是你的Erlang应用程序的配置提供程序。基本上是 application:get_env/2 在类固醇上。特性管理控制台可以通过telnet维护部门访问将为你 love在运行时重新加载( ...
Erlang是一种通用的面向并发的编程语言,它有瑞典电信设备制造商爱立信所辖的CS-Lab开发, 目的是创造一种可以应对大规模并发活动的编程语言和运行环境。
博文链接:https://maxtqm.iteye.com/blog/118429
我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...
Erlang/OTP 19.1 is a service release containing mostly bug fixes, as well as a number of new features and characteristics improvements. Some highlights of the release are: erts: Improved dirty ...