回答編集履歴

1

CSV

2018/03/26 13:05

投稿

asm
asm

スコア15147

test CHANGED
@@ -1,4 +1,6 @@
1
1
  とりあえず`benchmark-ips`を用いてベンチマーク取ってみました。
2
+
3
+ **追記:** `to_csv`が遅い理由がわかったのでCSV.newを使ってみるものを追加
2
4
 
3
5
 
4
6
 
@@ -18,6 +20,16 @@
18
20
 
19
21
  x.report("join") { array.map{|ary| ary.join ','}.join }
20
22
 
23
+ x.report("CSV"){
24
+
25
+ csv = CSV.new ""
26
+
27
+ array.each{|it| csv << it }
28
+
29
+ csv.string
30
+
31
+ }
32
+
21
33
  # CSVではないが参考までにMarshal.dump (Rubyのデータ吐き出し系では最速のハズ)
22
34
 
23
35
  x.report("marshal"){ Marshal.dump array }
@@ -36,21 +48,25 @@
36
48
 
37
49
  Calculating -------------------------------------
38
50
 
39
- to_csv 0.217 (± 0.0%) i/s - 2.000 in 9.207860s
51
+ to_csv 0.218 (± 0.0%) i/s - 2.000 in 9.170508s
40
52
 
41
- join 5.796 (± 0.0%) i/s - 29.000 in 5.029385s
53
+ join 5.510 (± 0.0%) i/s - 28.000 in 5.094200s
42
54
 
55
+ CSV 2.628 (± 0.0%) i/s - 14.000 in 5.329939s
56
+
43
- marshal 8.281 (± 0.0%) i/s - 42.000 in 5.077645s
57
+ marshal 8.665 (± 0.0%) i/s - 44.000 in 5.081920s
44
58
 
45
59
 
46
60
 
47
61
  Comparison:
48
62
 
49
- marshal: 8.3 i/s
63
+ marshal: 8.7 i/s
50
64
 
51
- join: 5.8 i/s - 1.43x slower
65
+ join: 5.5 i/s - 1.57x slower
52
66
 
67
+ CSV: 2.6 i/s - 3.30x slower
68
+
53
- to_csv: 0.2 i/s - 38.08x slower
69
+ to_csv: 0.2 i/s - 39.68x slower
54
70
 
55
71
  ```
56
72
 
@@ -59,3 +75,21 @@
59
75
  と、「配列を回す」というよりは「to_csv」が遅い
60
76
 
61
77
  という結果になりました。
78
+
79
+
80
+
81
+ ---
82
+
83
+
84
+
85
+ `to_csv`は1行ごとに
86
+
87
+ ```ruby
88
+
89
+ (CSV.new("") << row).string
90
+
91
+ ```
92
+
93
+ を行うため
94
+
95
+ 複数行を手に入れるために複数回繰り返すのは完全に無駄です。