Hatena::Grouperlang

檜山正幸のErlang未確認情報 RSSフィード

 | 

2009-03-27 (金)

リストのお尻に追加

| 14:07

%% -*- coding: utf-8 -*-

-module(append).
% -export([]).
-compile(export_all).

-define(TIMES, 100*100*2).

append_1(N, Limit, List) ->
  if (N =:= Limit) ->
      lists:reverse(List);
     true ->
      append_1(N + 1, Limit, [N|List])
  end.

append_2(N, Limit, List) ->
  if (N =:= Limit) ->
      List;
     true ->
      NewList = lists:reverse([N|lists:reverse(List)]),
      append_2(N + 1, Limit, NewList)
  end.

append_3(N, Limit, List) ->
  if (N =:= Limit) ->
      List;
     true ->
      NewList = lists:append(List, [N]),
      append_3(N + 1, Limit, NewList)
  end.

do() ->
  statistics(runtime),
  statistics(wall_clock),
  append_1(0, ?TIMES, []),
  {_, Runtime_1} = statistics(runtime),
  {_, Wall_Clock_1} = statistics(wall_clock),
  io:format("1. ~p (~p) milliseconds~n", [Runtime_1, Wall_Clock_1]),

  statistics(runtime),
  statistics(wall_clock),
  append_2(0, ?TIMES, []),
  {_, Runtime_2} = statistics(runtime),
  {_, Wall_Clock_2} = statistics(wall_clock),
  io:format("2. ~p (~p) milliseconds~n", [Runtime_2, Wall_Clock_2]),

  statistics(runtime),
  statistics(wall_clock),
  append_3(0, ?TIMES, []),
  {_, Runtime_3} = statistics(runtime),
  {_, Wall_Clock_3} = statistics(wall_clock),
  io:format("3. ~p (~p) milliseconds~n", [Runtime_3, Wall_Clock_3]).

3> c(append).
{ok,append}
4> append:do().
1. 10 (10) milliseconds
2. 10785 (15382) milliseconds
3. 7631 (10255) milliseconds
ok
5> append:do().
1. 10 (10) milliseconds
2. 10706 (14862) milliseconds
3. 5988 (8182) milliseconds
ok
6> append:do().
1. 0 (0) milliseconds
2. 9274 (13560) milliseconds
3. 5127 (6719) milliseconds
ok
7> append:do().
1. 0 (0) milliseconds
2. 9113 (13600) milliseconds
3. 7371 (10405) milliseconds
ok
8>

consで先頭に足していって一気にreverse、これは速い。毎回reverseを2回するとさすがに遅い。reverseはできるだけまとめてやるべき(当たり前だ)。lists:append/2もそんなには速くないなー、reverseを2回よりはマシだが。

jj1bdxjj1bdx2009/03/28 11:33あまり細かいオペレーションは,別の言語で外部に出してしまう,というのが得策かもしれませんね.

m-hiyamam-hiyama2009/03/28 12:33jj1bdxさん、
> 別の言語で
そうですね。どうせ必要そうなので、リンクインドライバの書き方を習おうかと思ってます。それとは別に、Erlangによる非破壊的操作のノウハウも必要ですね。パフォーマンスが深刻じゃない状況では、Erlangで書く方がさすがに容易ですから。

 |