- 浏览: 982345 次
- 性别:
- 来自: 广州
最新评论
-
qingchuwudi:
有用,非常感谢!
erlang进程的优先级 -
zfjdiamond:
你好 这条命令 在那里输入??
你们有yum 我有LuaRocks -
simsunny22:
这个是在linux下运行的吧,在window下怎么运行escr ...
escript的高级特性 -
mozhenghua:
http://www.erlang.org/doc/apps/ ...
mnesia 分布协调的几个细节 -
fxltsbl:
A new record of 108000 HTTP req ...
Haproxy 1.4-dev2: barrier of 100k HTTP req/s crossed
erlang的变量是不可变的 这是语法层面的事情,照理是绕不过的。但是hipe,erlang的jit模块打开了这扇门,请看:
sf bay facory 来自Facebook的Eugene Letuchy在ppt
http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf 里面提到:
hipe_bifs
Cheating single assignment
▪ Erlang is opinionated:
▪ Destructive assignment is hard because it should be
▪ hipe_bifs:bytearray_update() allows for destructive array assignment
▪ Necessary for aggregating Chat users’ presence
▪ Don’t tell anyone!
这是一个很好的绕过变量不可变的方法, 我再挖掘下google, 发现如下的文章:
http://erlang.org/pipermail/erlang-questions/2007-February/025331.html
Per Gustafsson <>
Thu Feb 22 17:41:01 CET 2007
* Previous message: [erlang-questions] Deforesting tuple updates
* Next message: [erlang-questions] Is UBF still going, or did it morph/fade?
* Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Joel Reymont wrote:
> I don't think it works for floats or doubles. It's just bytes or
> fixnums if I remember it correctly.
>
> On Feb 22, 2007, at 3:32 PM, Daniel Luna wrote:
>
>
>>As long as the values in the array are simple terms, you can use
>>hipe_bifs:bytearray/2.
>
>
> --
> http://wagerlabs.com/
>
>
>
>
>
> _______________________________________________
> erlang-questions mailing list
>
> http://www.erlang.org/mailman/listinfo/erlang-questions
You could use this code:
-module(floats).
-export([new/1,update/3,sum/1,
new2/1,update2/3,sum2/1,
test/0]).
new(N) ->
hipe_bifs:bytearray(N*8,0).
update(Arr,N,Float) ->
<<A1,A2,A3,A4,A5,A6,A7,A8>> = <<Float/float>>,
Start=N*8,
hipe_bifs:bytearray_update(Arr,Start,A1),
hipe_bifs:bytearray_update(Arr,Start+1,A2),
hipe_bifs:bytearray_update(Arr,Start+2,A3),
hipe_bifs:bytearray_update(Arr,Start+3,A4),
hipe_bifs:bytearray_update(Arr,Start+4,A5),
hipe_bifs:bytearray_update(Arr,Start+5,A6),
hipe_bifs:bytearray_update(Arr,Start+6,A7),
hipe_bifs:bytearray_update(Arr,Start+7,A8).
sum(Bin) ->
sum(Bin,0.0).
sum(<<Float/float,Rest/binary>>, Acc) ->
sum(Rest,Float+Acc);
sum(<<>>,Acc) -> Acc.
Performance is not that great, about 4-5 times faster updates than
gb_trees for arrays of 100000 floats, and summing is slower.
Per
试验下:
root@yufeng-desktop:~# cat floats.erl
-module(floats).
-export([new/1,update/3,sum/1]).
new(N) ->
hipe_bifs:bytearray(N*8,0).
update(Arr,N,Float) ->
<<A1,A2,A3,A4,A5,A6,A7,A8>> = <<Float/float>>,
Start=N*8,
hipe_bifs:bytearray_update(Arr,Start,A1),
hipe_bifs:bytearray_update(Arr,Start+1,A2),
hipe_bifs:bytearray_update(Arr,Start+2,A3),
hipe_bifs:bytearray_update(Arr,Start+3,A4),
hipe_bifs:bytearray_update(Arr,Start+4,A5),
hipe_bifs:bytearray_update(Arr,Start+5,A6),
hipe_bifs:bytearray_update(Arr,Start+6,A7),
hipe_bifs:bytearray_update(Arr,Start+7,A8).
sum(Bin) ->
sum(Bin,0.0).
sum(<<Float/float,Rest/binary>>, Acc) ->
sum(Rest,Float+Acc);
sum(<<>>,Acc) -> Acc.
root@yufeng-desktop:~# erl
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> F = floats:new(5).
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,...>>
2> rp(F).
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0>>
ok
3> floats:update(F, 1, 1234.00).
<<0,0,0,0,0,0,0,0,64,147,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,...>>
4> rp(F).
<<0,0,0,0,0,0,0,0,64,147,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
ok
5> floats:update(F, 2, 5678.00).
<<0,0,0,0,0,0,0,0,64,147,72,0,0,0,0,0,64,182,46,0,0,0,0,0,
0,0,0,0,0,...>>
6> rp(F).
<<0,0,0,0,0,0,0,0,64,147,72,0,0,0,0,0,64,182,46,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
ok
7> floats:sum(F).
6912.0
8> 1234+ 5678=6912.
6912
9>
恩 没问题的, 不错。
再到源码去挖掘下
...\otp_src_R13A-0\erts\emulator\hipe\hipe_bif0.tab
bif hipe_bifs:bytearray/2
bif hipe_bifs:bytearray_sub/2
bif hipe_bifs:bytearray_update/3
bif hipe_bifs:bitarray/2
bif hipe_bifs:bitarray_sub/2
bif hipe_bifs:bitarray_update/3
bif hipe_bifs:array/2
bif hipe_bifs:array_length/1
bif hipe_bifs:array_sub/2
bif hipe_bifs:array_update/3
bif hipe_bifs:ref/1
bif hipe_bifs:ref_get/1
bif hipe_bifs:ref_set/2
root@yufeng-desktop:~# erl
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> A=hipe_bifs:array(10, []).
2135987033931617136292706780490918553627426255794015745390464377869606912860751039403868490301435
2> rp(A).
2135987033931617136292706780490918553627426255794015745390464377869606912860751039403868490301435
ok
3> hipe_bifs:array_length(A).
10
4> hipe_bifs:array_update(A, 2, 1).
2135987033931617136292706780490918553627426255794015745390464377869527684698900857852928490209275
5>
5> hipe_bifs:array_update(A, 1, atom).
2135987033931617136292706780490918553627426255794015745390464377869527684698882411121018128039931
6> hipe_bifs:array_sub(A,1).
atom
7> hipe_bifs:array_sub(A,2).
1
8> R=hipe_bifs:ref(1).
31
9> hipe_bifs:ref_get(R).
1
10> hipe_bifs:ref_set(R, 10).
175
11> hipe_bifs:ref_get(R).
10
O Yeah 这些也都OK.
还有很多hipe_bifs的导出在相应的.tab文件里面,读者自己挖掘了。这样我们就可以把状态更新, 无需通过消息 或者 ets, 大大加快效率。
附上8皇后的hipe源码。
这还差不多 多教你点
请吃饭喝酒泡妞吧
sf bay facory 来自Facebook的Eugene Letuchy在ppt
http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf 里面提到:
hipe_bifs
Cheating single assignment
▪ Erlang is opinionated:
▪ Destructive assignment is hard because it should be
▪ hipe_bifs:bytearray_update() allows for destructive array assignment
▪ Necessary for aggregating Chat users’ presence
▪ Don’t tell anyone!
这是一个很好的绕过变量不可变的方法, 我再挖掘下google, 发现如下的文章:
http://erlang.org/pipermail/erlang-questions/2007-February/025331.html
Per Gustafsson <>
Thu Feb 22 17:41:01 CET 2007
* Previous message: [erlang-questions] Deforesting tuple updates
* Next message: [erlang-questions] Is UBF still going, or did it morph/fade?
* Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Joel Reymont wrote:
> I don't think it works for floats or doubles. It's just bytes or
> fixnums if I remember it correctly.
>
> On Feb 22, 2007, at 3:32 PM, Daniel Luna wrote:
>
>
>>As long as the values in the array are simple terms, you can use
>>hipe_bifs:bytearray/2.
>
>
> --
> http://wagerlabs.com/
>
>
>
>
>
> _______________________________________________
> erlang-questions mailing list
>
> http://www.erlang.org/mailman/listinfo/erlang-questions
You could use this code:
-module(floats).
-export([new/1,update/3,sum/1,
new2/1,update2/3,sum2/1,
test/0]).
new(N) ->
hipe_bifs:bytearray(N*8,0).
update(Arr,N,Float) ->
<<A1,A2,A3,A4,A5,A6,A7,A8>> = <<Float/float>>,
Start=N*8,
hipe_bifs:bytearray_update(Arr,Start,A1),
hipe_bifs:bytearray_update(Arr,Start+1,A2),
hipe_bifs:bytearray_update(Arr,Start+2,A3),
hipe_bifs:bytearray_update(Arr,Start+3,A4),
hipe_bifs:bytearray_update(Arr,Start+4,A5),
hipe_bifs:bytearray_update(Arr,Start+5,A6),
hipe_bifs:bytearray_update(Arr,Start+6,A7),
hipe_bifs:bytearray_update(Arr,Start+7,A8).
sum(Bin) ->
sum(Bin,0.0).
sum(<<Float/float,Rest/binary>>, Acc) ->
sum(Rest,Float+Acc);
sum(<<>>,Acc) -> Acc.
Performance is not that great, about 4-5 times faster updates than
gb_trees for arrays of 100000 floats, and summing is slower.
Per
试验下:
root@yufeng-desktop:~# cat floats.erl
-module(floats).
-export([new/1,update/3,sum/1]).
new(N) ->
hipe_bifs:bytearray(N*8,0).
update(Arr,N,Float) ->
<<A1,A2,A3,A4,A5,A6,A7,A8>> = <<Float/float>>,
Start=N*8,
hipe_bifs:bytearray_update(Arr,Start,A1),
hipe_bifs:bytearray_update(Arr,Start+1,A2),
hipe_bifs:bytearray_update(Arr,Start+2,A3),
hipe_bifs:bytearray_update(Arr,Start+3,A4),
hipe_bifs:bytearray_update(Arr,Start+4,A5),
hipe_bifs:bytearray_update(Arr,Start+5,A6),
hipe_bifs:bytearray_update(Arr,Start+6,A7),
hipe_bifs:bytearray_update(Arr,Start+7,A8).
sum(Bin) ->
sum(Bin,0.0).
sum(<<Float/float,Rest/binary>>, Acc) ->
sum(Rest,Float+Acc);
sum(<<>>,Acc) -> Acc.
root@yufeng-desktop:~# erl
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> F = floats:new(5).
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,...>>
2> rp(F).
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0>>
ok
3> floats:update(F, 1, 1234.00).
<<0,0,0,0,0,0,0,0,64,147,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,...>>
4> rp(F).
<<0,0,0,0,0,0,0,0,64,147,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
ok
5> floats:update(F, 2, 5678.00).
<<0,0,0,0,0,0,0,0,64,147,72,0,0,0,0,0,64,182,46,0,0,0,0,0,
0,0,0,0,0,...>>
6> rp(F).
<<0,0,0,0,0,0,0,0,64,147,72,0,0,0,0,0,64,182,46,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
ok
7> floats:sum(F).
6912.0
8> 1234+ 5678=6912.
6912
9>
恩 没问题的, 不错。
再到源码去挖掘下
...\otp_src_R13A-0\erts\emulator\hipe\hipe_bif0.tab
bif hipe_bifs:bytearray/2
bif hipe_bifs:bytearray_sub/2
bif hipe_bifs:bytearray_update/3
bif hipe_bifs:bitarray/2
bif hipe_bifs:bitarray_sub/2
bif hipe_bifs:bitarray_update/3
bif hipe_bifs:array/2
bif hipe_bifs:array_length/1
bif hipe_bifs:array_sub/2
bif hipe_bifs:array_update/3
bif hipe_bifs:ref/1
bif hipe_bifs:ref_get/1
bif hipe_bifs:ref_set/2
root@yufeng-desktop:~# erl
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2 (abort with ^G)
1> A=hipe_bifs:array(10, []).
2135987033931617136292706780490918553627426255794015745390464377869606912860751039403868490301435
2> rp(A).
2135987033931617136292706780490918553627426255794015745390464377869606912860751039403868490301435
ok
3> hipe_bifs:array_length(A).
10
4> hipe_bifs:array_update(A, 2, 1).
2135987033931617136292706780490918553627426255794015745390464377869527684698900857852928490209275
5>
5> hipe_bifs:array_update(A, 1, atom).
2135987033931617136292706780490918553627426255794015745390464377869527684698882411121018128039931
6> hipe_bifs:array_sub(A,1).
atom
7> hipe_bifs:array_sub(A,2).
1
8> R=hipe_bifs:ref(1).
31
9> hipe_bifs:ref_get(R).
1
10> hipe_bifs:ref_set(R, 10).
175
11> hipe_bifs:ref_get(R).
10
O Yeah 这些也都OK.
还有很多hipe_bifs的导出在相应的.tab文件里面,读者自己挖掘了。这样我们就可以把状态更新, 无需通过消息 或者 ets, 大大加快效率。
附上8皇后的hipe源码。
- nqueens_ha.rar (1.1 KB)
- 下载次数: 19
评论
11 楼
mryufeng
2009-11-11
whrllm 写道
呵呵,你来我这,我包你吃饭喝酒泡妞//
这还差不多 多教你点
10 楼
whrllm
2009-11-11
呵呵,你来我这,我包你吃饭喝酒泡妞//
9 楼
whrllm
2009-11-11
老大,请问一下,如何结合const pool使用啊?能不能提示一下啊?谢谢
8 楼
mryufeng
2009-11-11
whrllm 写道
以前没能理解,现在用上了,才知道好啊,老大,你的好东西太多了,哈哈/
请吃饭喝酒泡妞吧
7 楼
whrllm
2009-11-11
以前没能理解,现在用上了,才知道好啊,老大,你的好东西太多了,哈哈/
6 楼
mryufeng
2009-06-03
主要是考虑到erlang的所以状态都是在进程维护的 要改变状态 必须给进程发消息 这个开销有时候是不可承受的 比较改变一个变量的值 要做的事情太多 进程要调度2次 很吓人的。
5 楼
halida
2009-06-03
原先優美簡單的程序就是這樣一步步被crack成為復雜,難以理解,難以維護的遺產代碼的。。。
4 楼
mryufeng
2009-05-31
结合const pool我们可以做出全局变量的东西 哈哈 真好用!
3 楼
mryufeng
2009-05-31
en 这个是追求速度 某些场合还是很好用的
2 楼
美洲豹
2009-05-30
估计这些都是所谓的脏函数
1 楼
mryufeng
2009-05-30
不过除非必要 不要用这些trick 毕竟是和设计的初衷违背的东西。
发表评论
-
OTP R14A今天发布了
2010-06-17 14:36 2677以下是这次发布的亮点,没有太大的性能改进, 主要是修理了很多B ... -
R14A实现了EEP31,添加了binary模块
2010-05-21 15:15 3030Erlang的binary数据结构非常强大,而且偏向底层,在作 ... -
如何查看节点的可用句柄数目和已用句柄数
2010-04-08 03:31 4814很多同学在使用erlang的过程中, 碰到了很奇怪的问题, 后 ... -
获取Erlang系统信息的代码片段
2010-04-06 21:49 3475从lib/megaco/src/tcp/megaco_tcp_ ... -
iolist跟list有什么区别?
2010-04-06 20:30 6529看到erlang-china.org上有个 ... -
erlang:send_after和erlang:start_timer的使用解释
2010-04-06 18:31 8386前段时间arksea 同学提出这个问题, 因为文档里面写的很不 ... -
Latest news from the Erlang/OTP team at Ericsson 2010
2010-04-05 19:23 2013参考Talk http://www.erlang-factor ... -
对try 异常 运行的疑问,为什么出现两种结果
2010-04-05 19:22 2842郎咸武<langxianzhe@163.com> ... -
Erlang ERTS Async基础设施
2010-03-19 00:03 2517其实Erts的Async做的很不错的, 相当的完备, 性能又高 ... -
CloudI 0.0.9 Released, A Cloud as an Interface
2010-03-09 22:32 2476基于Erlang的云平台 看了下代码 质量还是不错的 完成了不 ... -
Memory matters - even in Erlang (再次说明了了解内存如何工作的必要性)
2010-03-09 20:26 3439原文地址:http://www.lshift.net/blog ... -
Some simple examples of using Erlang’s XPath implementation
2010-03-08 23:30 2050原文地址 http://www.lshift.net/blog ... -
lcnt 环境搭建
2010-02-26 16:19 2614抄书:otp_doc_html_R13B04/lib/tool ... -
Erlang强大的代码重构工具 tidier
2010-02-25 16:22 2486Jan 29, 2010 We are very happy ... -
[Feb 24 2010] Erlang/OTP R13B04 has been released
2010-02-25 00:31 1387Erlang/OTP R13B04 has been rele ... -
R13B04 Installation
2010-01-28 10:28 1390R13B04后erlang的源码编译为了考虑移植性,就改变了编 ... -
Running tests
2010-01-19 14:51 1486R13B03以后 OTP的模块加入了大量的测试模块,这些模块都 ... -
R13B04在细化Binary heap
2010-01-14 15:11 1508从github otp的更新日志可以清楚的看到otp R13B ... -
R13B03 binary vheap有助减少binary内存压力
2009-11-29 16:07 1668R13B03 binary vheap有助减少binary内存 ... -
erl_nif 扩展erlang的另外一种方法
2009-11-26 01:02 3218我们知道扩展erl有2种方法, driver和port. 这2 ...
相关推荐
第4章 自定义变量和CSV可变参数实战 jmeter基础学习 不错的
如果一个变量的值被修改后,其内存地址发生了改变,则这个类型是不可变的;如果变量值改变而内存地址保持不变,则是可变类型。通过这种方法,我们可以在运行时判断任何Python数据类型的可变性。 在函数参数传递方面...
相反,不可变对象一旦创建,就不能改变,若尝试修改,实际上会创建一个新对象并改变变量的指向。 首先,关于标题中提到的`None`,它是Python中的一个特殊值,表示空或不存在。在Python中,`is`操作符用于检查两个...
Rust语言基础语法——变量和可变性
如果不使用绑定变量,每次查询都是一个新的查询,这将导致 Oracle 需要分析、解析、安全检查、优化等一系列操作。这些操作将消耗大量的系统资源,降低用户的使用数量,并且会把优化好的其它查询语句从共享池中踢出。...
python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址。 一、可变对象和不可变对象 ...从上图可知,不可变对象的特征没有变,变的只是创建了新对象,改变了变量的对象引用。 看一个例
va_start宏将va_list变量设置为指向第一个可变参数的位置。 3. va_arg: 这个宏用于访问可变参数列表中的参数。它有两个参数,第一个是va_list变量,第二个是正在访问的参数的类型。va_arg宏返回当前参数的值,并...
- 可变变量的名称不能包含空格、标点符号或者数字开头(除非使用方括号语法 `$$['hello']`)。 - 可变变量在某些情况下可能导致代码难以理解和维护,因此在编写代码时应谨慎使用,避免过度依赖这一特性。 5. **...
本文主要介绍了Rust中的变量、常量与不可变变量、重影(Shadowing)等基础概念
可变变量在处理动态数据和配置时非常有用,尤其在需要通过变量名来引用变量的场景下。 在PHP中,普通变量是使用一个美元符号`$`声明的,如`$variableName`。而可变变量使用两个美元符号`$$`,表示后续的字符串将被...
注意:这里的可变不可变指的是内存中的那块内容(value)是否可以被改变。如果是不可变类型的话,在对对象本身操作的时候,必须在内存中新申请一块区域(因为老区域不可变)。如果是可变类型,在对对象操作的时候,...
例如,`echo`, `print`, `unset()`, `isset()`, `empty()`, `include`, `require` 等都不能直接作为可变函数。如果需要使用这些结构,我们需要自定义包装函数来实现可变调用,如下所示: ```php function variable_...
定义一个结构体,里面包含你要公共使用的变量. 然后在主程序 new一个这个结构体的指针. 然后在每个界面类里定义一个这个结构体的指针. 然后在界面初始化时将你那个new出来的指针传递进界面. 这样每个界面都可以访问...
在电力市场环境下,由于负荷需求、可再生能源发电的波动性以及设备故障等因素,电网的运行条件变得越来越不确定。半不变量法是一种解决这种不确定性的有效方法,它提供了一种计算电网在不同概率下的稳定运行状态的...
不可变对象的定义并不是将域简单地等于将对象的所有变量都声明为final类型,所有域都是final类型的对象仍然可以是可变的,因为final域可以获得一个可变对象的引用。一个不可变的对象必须满足的条件:它的状态在创建...
5.4_列表的可变与元组的不可变|Python的变量与运算符|Python3.8入门_&_进阶_&_原生爬虫实战完全解读
有时候使用可变变量名是很方便的。就是说,一个变量的变量名可以动态的设置和使用。一个普通的变量通过声明来设置,例如: $a = 'hello'; $$a = 'world'; echo $a ${$a}; echo $a $hello; 它们都会输出:hello ...
在Python编程语言中,字典、集合和不可变集合是三种重要的数据结构,它们各自具有独特的特性和用途。本篇文章将深入探讨这些概念,并详细解释它们的赋值机制。 首先,我们来了解一下**字典(Dictionary)**。字典是...
66 025_3可变静态变量.mp4