3
我知道ETS表的查找时间是不变的。但是我也听说过,表格被保存在进程之外,当检索数据时,它需要移动到进程堆中。所以,这很昂贵。但是,如何解释这一点:从ETS表中检索数据
18> {Time, [[{ok, Binary}]]} = timer:tc(ets, match, [utilo, {a, '$1'}]).
{0,
[[{ok,<<255,216,255,225,63,254,69,120,105,102,0,0,73,
73,42,0,8,0,0,0,10,0,14,...>>}]]}
19> size(Binary).
1759017
1.7 MB二进制需要0时间从表中检索!?
编辑:当我看到Odobenus Rosmarus的回答后,我决定将二进制转换为列表。下面是结果:
1> {ok, B} = file:read_file("IMG_2171.JPG").
{ok,<<255,216,255,225,63,254,69,120,105,102,0,0,73,73,42,
0,8,0,0,0,10,0,14,1,2,0,32,...>>}
2> size(B).
1986392
3> L = binary_to_list(B).
[255,216,255,225,63,254,69,120,105,102,0,0,73,73,42,0,8,0,0,
0,10,0,14,1,2,0,32,0,0|...]
4> length(L).
1986392
5> ets:insert(utilo, {a, L}).
true
6> timer:tc(ets, match, [utilo, {a, '$1'}]).
{106000,
[[[255,216,255,225,63,254,69,120,105,102,0,0,73,73,42,0,8,0,
0,0,10,0,14,1,2|...]]]}
现在只需要106000 微秒来检索的速度非常快表1986392长list
,不是吗?列表是每个元素2个字。因此数据是4x1.7MB。
编辑2:我开始在二郎个问题(http://groups.google.com/group/erlang-programming/browse_thread/thread/5581a8b5b27d4fe1)线程和事实证明,0.1秒非常需要做的memcpy()(移动数据到进程的堆)的时间。另一方面,Odobenus Rosmarus的回答解释了为什么检索二进制文件需要0次。
感谢您的回答。我试着用'list'和1986392长列表检索106000微秒。蛮快。 – 2012-01-11 06:38:55
很好的答案!你的意思是64字节,而不是位:) – 2012-01-22 12:17:42