o**2 发帖数: 168 | |
o**2 发帖数: 168 | 2 这个范例展示的是FMP其中的一个feature: callFunction()。其实展示的内容和前两天
给出的代码片断是一样的,不过这里的是完整的、大家可以在自己的机器上运行的范例。
通过这个范例,大家可以观察:
1) 分别运行OopMain和FmpMain,visual地比较CPU的usages。
2) 比较OopMain和FmpMain源程序的异同。
3) FMP的灵活性,和其本身的大小(大约20K的jar,Java版的源码也就是900行)。
FMP把callFunction()设计成一个普通method call的replacement,当这个method本身
是相当独立的,就象这个范例展示的一样。 |
o**2 发帖数: 168 | 3 贴一下在我机器上的运行结果
OopMain
=======
Computing Fibonacci(5,000,000) ...
F(5,000,000) = 01537B41EBC050D32C62 ... 91D4E3B63F87A1EF7A45
Total time: 17831 ms.
FmpMain
=======
Computing Fibonacci(5,000,000) ...
F(5,000,000) = 01537B41EBC050D32C62 ... 91D4E3B63F87A1EF7A45
Total time: 9111 ms. |
n***e 发帖数: 723 | 4 其实c#的语法糖现在很牛的,有await,parallel,task之类的东西。
大概你做的东西可能和这两个比较像?
Task.WaitAll
http://msdn.microsoft.com/en-us/library/dd270695.aspx
Task.WhenAll
http://msdn.microsoft.com/en-us/library/hh194874.aspx
不知道java/scala,但是应该也有相应的语法糖吧?这个二爷应该比较清楚。
不过怎么说呢,虽然有点重复造轮子的赶脚,但你这种实现方法还是蛮有意思的。 |
b***i 发帖数: 3043 | 5 比较时间没有意义啊,用已有的各类framework比才有意义。比如我的程序全面多线程
,连打开文件那个〇penDialog都不直接打开文件而是开始一个线程。所以真正要比的
是你新的语法是否更直观简洁
【在 o**2 的大作中提到】 : 贴一下在我机器上的运行结果 : OopMain : ======= : Computing Fibonacci(5,000,000) ... : F(5,000,000) = 01537B41EBC050D32C62 ... 91D4E3B63F87A1EF7A45 : Total time: 17831 ms. : FmpMain : ======= : Computing Fibonacci(5,000,000) ... : F(5,000,000) = 01537B41EBC050D32C62 ... 91D4E3B63F87A1EF7A45
|
o**2 发帖数: 168 | 6 在这个特例上,FMP的使用方法的确和C#/Java的Task有类似之处。(顺便问一句,你是
做C#的吗?FMP也是有C#版的。)
所以我特意在FmpMain里面埋了个包袱,就是Object[] implObjs = new Object[3];
你有兴趣的话不妨试试把这个3改成其它的数字,比如1,2,4,5,6等,看看有什么区
别。应该会体会到FMP和Task有很大的不同。
【在 n***e 的大作中提到】 : 其实c#的语法糖现在很牛的,有await,parallel,task之类的东西。 : 大概你做的东西可能和这两个比较像? : Task.WaitAll : http://msdn.microsoft.com/en-us/library/dd270695.aspx : Task.WhenAll : http://msdn.microsoft.com/en-us/library/hh194874.aspx : 不知道java/scala,但是应该也有相应的语法糖吧?这个二爷应该比较清楚。 : 不过怎么说呢,虽然有点重复造轮子的赶脚,但你这种实现方法还是蛮有意思的。
|
o**2 发帖数: 168 | 7 这个比较不是为了定量地看谁快。首先,FMP号称no thread concurrency,所以使用
FMP的程序不需要直接使用thread,那我就要给个结果,证明FMP的程序的确并发了。
其次,就是我在上面回复中提到的参数 3 的作用。有结果显示的话,方便比较不同参
数的不同效果。
你说的“比如我的程序全面多线程 ,连打开文件那个OpenDialog都不直接打开文件而
是开始一个线程”涉及到了FMP的另一个优点,我在这里简单提一下,因为超出了本
post的scope。那就是messenger非常简单(我写的reference implementation只有900
行Java代码),用户可以自己定制的messenger。比如可以做一个给Swing程序用的
SwingMessenger(我以前提供过,以后也会再提供),然后在注册receiver的时候注明
这个receiver是用普通thread的,还是Swing thread的:
1) messenger.registerReceiver();
2) messenger.registerSwingReceiver();
【在 b***i 的大作中提到】 : 比较时间没有意义啊,用已有的各类framework比才有意义。比如我的程序全面多线程 : ,连打开文件那个〇penDialog都不直接打开文件而是开始一个线程。所以真正要比的 : 是你新的语法是否更直观简洁
|
o**2 发帖数: 168 | 8 这个参数 3 涉及了FMP的重要概念,就是active object。在FmpMain里面"calculator"
就是一个active object。FMP对调用和被调用的objects来说,都是no thread的,当然
messenger属于FMP系统object,最后还是要用thread来实现active object的。
FMP赋予了active object并发的语义:一个activeobject可以是一个single worker(
就是sequential programming);也可以是一个team of workers(就是多个独立的
sequential programming)。所以这个 3 是head count的意思。
在computeDijkstraFormula()里,每次调用"calculator:multiply" 3次,也就是说
这个算法的最大并发数是 3。于是参数 1 等于单个worker; 2 等于 a team of 2
workers; 速度也随之增快。但超过 3 之后,就不能在加快了。
对于调用和被调用的objects来说,这都是透明的,属于配置设计。 |