
Pacakges
Background
Rで行列を作るとき、matrix()でも`dim<-`()でも作れるのですが、どっちが速いのかなーと比べたくなりました。シミュレーションで1条件当たり何万回~も回すときは少しでも速い方がいいのです。
前にちょこっとやったものの条件をもっと増やしてみました。
Rの備忘録
— Takuto SAKAI (@tsakai_psych) March 22, 2026
2x2と3x3しかやってないけど、byrowで入れないならmatrixよりもdim<-の方が速そう pic.twitter.com/17emiEOTyQ
matrix()
ベクトルを行列にできます。引数nrowで行数を指定するか、引数ncolで列数を指定します。
行数や列数を指定しない場合、n行1列の行列ができます。
基本的には列方向にベクトルを入れていくようですが、引数byrowをTRUEにすると行方向にベクトルを入れられます。
引数dimnamesにlist(行名のベクトル, 列名のベクトル)を入れることで、行名と列名を設定できます。いらないところはNULLを入れると設定されません。
`dim<-`()
オブジェクトに次元を付与したりなくしたりできます。ふつうはdim(obj) <- valueで使うと思いますが、`dim<-`(obj, value)1も使えます。後者の記法はパイプラインと相性がいいです。引数valueには整数ベクトルを入れます。行列なら長さ2のベクトルを入れればいいです。
オブジェクトの長さと次元数がマッチしない場合はエラーを吐きます。
あと、matrix(..., byrow = TRUE)みたいなことはできないっぽいです、多分。
Benchmark
いつも使っているmicrobenchmark::microbenchmark()と、最近なんとなく使い方がわかってきたbench::mark()でベンチマークを回してみます。実際の場面ではintかnumericを扱う場合が多いと思うので、入力はrunif()で作ることにします。
microbenchmark
行数と列数に複数の水準を作りたいので、条件のdfを作って回したいと思います。条件は行列それぞれ1から10までです。1×1は除きます。
# A tibble: 99 × 2
nr nc
<int> <int>
1 1 2
2 1 3
3 1 4
4 1 5
5 1 6
6 1 7
7 1 8
8 1 9
9 1 10
10 2 1
11 2 2
12 2 3
13 2 4
14 2 5
15 2 6
16 2 7
17 2 8
18 2 9
19 2 10
20 3 1
21 3 2
22 3 3
23 3 4
24 3 5
25 3 6
26 3 7
27 3 8
28 3 9
29 3 10
30 4 1
31 4 2
32 4 3
33 4 4
34 4 5
35 4 6
36 4 7
37 4 8
38 4 9
39 4 10
40 5 1
41 5 2
42 5 3
43 5 4
44 5 5
45 5 6
46 5 7
47 5 8
48 5 9
49 5 10
50 6 1
51 6 2
52 6 3
53 6 4
54 6 5
55 6 6
56 6 7
57 6 8
58 6 9
59 6 10
60 7 1
61 7 2
62 7 3
63 7 4
64 7 5
65 7 6
66 7 7
67 7 8
68 7 9
69 7 10
70 8 1
71 8 2
72 8 3
73 8 4
74 8 5
75 8 6
76 8 7
77 8 8
78 8 9
79 8 10
80 9 1
81 9 2
82 9 3
83 9 4
84 9 5
85 9 6
86 9 7
87 9 8
88 9 9
89 9 10
90 10 1
91 10 2
92 10 3
93 10 4
94 10 5
95 10 6
96 10 7
97 10 8
98 10 9
99 10 10
ベンチマークを回します。
res_mb <-
df_condition |>
dplyr::mutate(
res = purrr::pmap(
.l = list(
x = nr,
y = nc
),
.f = \(x, y) {
elements <- runif(x * y)
microbenchmark::microbenchmark(
"matrix" = matrix(elements, nrow = x),
"dim" = `dim<-`(elements, c(x, y)),
check = "equal"
)
},
.progress = list(
clear = FALSE,
show_after = 0,
format = "{cli::pb_bar} ({cli::pb_percent} in {cli::pb_elapsed})|{cli::pb_eta_str}"
)
) |>
1 setNames(paste0("r", nr, "c", nc))
)- 1
-
purrr::pmapの戻り値を名前付きにしておくと、後でggplot2::autoplot()するときとかに便利。
■ ( 0% in 1ms)|
■■■ ( 8% in 816ms)|ETA: 9s
■■■■■■■■■■■■■ ( 39% in 3.8s)|ETA: 6s
■■■■■■■■■■■■■■■■■■■■■■ ( 71% in 6.8s)|ETA: 3s
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ (100% in 9.6s)|ETA: 0s
結果は以下の通りです。
res_mb |>
1 reframe(
temp = purrr::map(
.x = res,
.f = \(x) microbenchmark:::summary.microbenchmark(x)
),
.by = c(nr, nc)
) |>
unnest(temp) |>
print(n = 999)- 1
-
そのまま
res_mb$resとかdplyr::pull()とかで引っ張ってくると出力が縦に長すぎちゃうので、microbenchmark:::summary.microbenchmark()がdata.frameを返してくるのを利用してdplyr::reframe()して多少短くします。(条件が多くて時間がかかるのであんまり意味はなさそうですが…。)
# A tibble: 198 × 11
nr nc expr min lq mean median uq max neval cld
<int> <int> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 1 2 matrix 700 800 925 800 900 6100 100 "a "
2 1 2 dim 200 300 302 300 300 2100 100 " b"
3 1 3 matrix 800 800 910 800 900 4300 100 "a "
4 1 3 dim 200 300 324 300 300 2700 100 " b"
5 1 4 matrix 700 800 981 850 900 6700 100 "a "
6 1 4 dim 200 300 345 300 300 3000 100 " b"
7 1 5 matrix 800 800 933 800 900 7000 100 "a "
8 1 5 dim 200 300 328 300 300 2700 100 " b"
9 1 6 matrix 800 900 1109 1000 1100 5900 100 "a "
10 1 6 dim 200 300 443 400 400 3600 100 " b"
11 1 7 matrix 700 800 941 900 900 6800 100 "a "
12 1 7 dim 200 300 319 300 300 2300 100 " b"
13 1 8 matrix 800 800 900 800 900 4300 100 "a "
14 1 8 dim 200 300 304 300 300 1900 100 " b"
15 1 9 matrix 700 800 908 800 900 3700 100 "a "
16 1 9 dim 200 300 319 300 300 2200 100 " b"
17 1 10 matrix 700 800 936 800 900 8000 100 "a "
18 1 10 dim 200 300 356 300 300 5200 100 " b"
19 2 1 matrix 800 800 909 900 900 4300 100 "a "
20 2 1 dim 200 300 304 300 300 1600 100 " b"
21 2 2 matrix 800 800 925 900 900 3900 100 "a "
22 2 2 dim 200 300 325 300 300 2100 100 " b"
23 2 3 matrix 700 800 901 800 900 4700 100 "a "
24 2 3 dim 200 300 331 300 300 3500 100 " b"
25 2 4 matrix 800 1000 1167 1000 1100 7100 100 "a "
26 2 4 dim 200 300 399 400 400 2800 100 " b"
27 2 5 matrix 700 800 879 800 900 2900 100 "a "
28 2 5 dim 200 300 317 300 300 2500 100 " b"
29 2 6 matrix 800 1000 1128 1000 1100 6100 100 "a "
30 2 6 dim 200 300 427 400 400 3700 100 " b"
31 2 7 matrix 800 800 895 800 900 4400 100 "a "
32 2 7 dim 200 300 344 300 300 3600 100 " b"
33 2 8 matrix 700 800 908 800 900 4800 100 "a "
34 2 8 dim 200 300 330 300 300 3700 100 " b"
35 2 9 matrix 800 900 1241 900 1000 17900 100 "a "
36 2 9 dim 200 300 476 400 400 3000 100 " b"
37 2 10 matrix 800 900 1207 1000 1000 12100 100 "a "
38 2 10 dim 300 300 456 400 400 5300 100 " b"
39 3 1 matrix 700 800 912 800 900 5300 100 "a "
40 3 1 dim 200 300 336 300 300 3800 100 " b"
41 3 2 matrix 700 800 897 800 900 4300 100 "a "
42 3 2 dim 200 300 325 300 300 3200 100 " b"
43 3 3 matrix 700 800 925 800 900 6400 100 "a "
44 3 3 dim 200 300 341 300 300 2400 100 " b"
45 3 4 matrix 800 800 953 800 900 8800 100 "a "
46 3 4 dim 200 300 318 300 300 2600 100 " b"
47 3 5 matrix 700 800 908 800 900 5100 100 "a "
48 3 5 dim 200 300 336 300 300 3600 100 " b"
49 3 6 matrix 800 900 1194 900 1000 12400 100 "a "
50 3 6 dim 300 300 612 400 400 8300 100 " b"
51 3 7 matrix 800 900 1103 1000 1100 8100 100 "a "
52 3 7 dim 300 400 590 400 400 13600 100 " b"
53 3 8 matrix 800 900 1277 1000 1100 21900 100 "a "
54 3 8 dim 300 400 629 400 500 12600 100 " b"
55 3 9 matrix 800 900 1110 1000 1100 4900 100 "a "
56 3 9 dim 300 300 441 400 400 3300 100 " b"
57 3 10 matrix 800 900 1164 1000 1100 11700 100 "a "
58 3 10 dim 300 300 494 400 400 3400 100 " b"
59 4 1 matrix 800 800 925 900 900 4200 100 "a "
60 4 1 dim 200 300 338 300 300 3200 100 " b"
61 4 2 matrix 800 800 945 900 900 6500 100 "a "
62 4 2 dim 200 300 309 300 300 1700 100 " b"
63 4 3 matrix 800 800 919 800 900 5800 100 "a "
64 4 3 dim 200 300 313 300 300 2200 100 " b"
65 4 4 matrix 700 800 921 800 900 6000 100 "a "
66 4 4 dim 200 300 347 300 300 4800 100 " b"
67 4 5 matrix 800 900 1085 1000 1000 10000 100 "a "
68 4 5 dim 200 300 585 400 400 10900 100 " b"
69 4 6 matrix 900 1100 1405 1200 1300 9900 100 "a "
70 4 6 dim 300 400 543 500 500 3900 100 " b"
71 4 7 matrix 800 900 1057 900 1000 6500 100 "a "
72 4 7 dim 300 300 433 400 400 3900 100 " b"
73 4 8 matrix 800 900 1020 950 1000 5200 100 "a "
74 4 8 dim 200 400 458 400 400 4900 100 " b"
75 4 9 matrix 800 900 1152 1000 1100 14600 100 "a "
76 4 9 dim 300 400 435 400 400 3400 100 " b"
77 4 10 matrix 800 900 1193 1000 1100 8000 100 "a "
78 4 10 dim 300 300 593 400 400 8000 100 " b"
79 5 1 matrix 700 800 939 800 900 7400 100 "a "
80 5 1 dim 200 300 335 300 300 3200 100 " b"
81 5 2 matrix 800 800 914 800 900 5000 100 "a "
82 5 2 dim 200 300 331 300 300 3600 100 " b"
83 5 3 matrix 800 800 934 900 900 5400 100 "a "
84 5 3 dim 200 300 322 300 300 1700 100 " b"
85 5 4 matrix 800 900 1187 900 1000 15300 100 "a "
86 5 4 dim 300 350 514 400 400 3100 100 " b"
87 5 5 matrix 800 900 1056 1000 1050 6000 100 "a"
88 5 5 dim 300 400 683 400 400 20400 100 "a"
89 5 6 matrix 800 900 1088 900 1000 4800 100 "a "
90 5 6 dim 200 300 613 400 400 7400 100 " b"
91 5 7 matrix 900 1100 1255 1200 1200 5600 100 "a "
92 5 7 dim 300 400 543 500 500 4400 100 " b"
93 5 8 matrix 800 900 1355 1000 1250 13700 100 "a "
94 5 8 dim 200 300 623 400 450 13000 100 " b"
95 5 9 matrix 800 900 1213 1000 1100 14800 100 "a "
96 5 9 dim 200 300 526 400 400 3300 100 " b"
97 5 10 matrix 800 900 1138 1000 1000 4700 100 "a "
98 5 10 dim 200 300 649 400 400 14800 100 " b"
99 6 1 matrix 800 800 906 800 900 3700 100 "a "
100 6 1 dim 200 300 345 300 300 3200 100 " b"
101 6 2 matrix 700 800 964 850 900 6600 100 "a "
102 6 2 dim 200 300 323 300 300 2700 100 " b"
103 6 3 matrix 800 900 1208 1000 1100 12800 100 "a "
104 6 3 dim 200 300 442 400 400 2200 100 " b"
105 6 4 matrix 800 900 1083 900 1000 6100 100 "a "
106 6 4 dim 300 300 534 400 400 11100 100 " b"
107 6 5 matrix 800 900 1204 900 1000 8900 100 "a "
108 6 5 dim 200 300 535 400 400 4000 100 " b"
109 6 6 matrix 800 900 1057 900 1000 8100 100 "a "
110 6 6 dim 300 300 413 400 400 2700 100 " b"
111 6 7 matrix 800 900 1177 1000 1100 8100 100 "a "
112 6 7 dim 200 400 655 400 400 13600 100 " b"
113 6 8 matrix 1000 1100 1550 1200 1300 8100 100 "a "
114 6 8 dim 300 400 900 500 550 16800 100 " b"
115 6 9 matrix 800 900 1252 1000 1100 5100 100 "a "
116 6 9 dim 200 300 724 400 450 11200 100 " b"
117 6 10 matrix 800 900 1253 1000 1100 9700 100 "a "
118 6 10 dim 200 300 467 400 400 2900 100 " b"
119 7 1 matrix 700 800 913 800 900 4400 100 "a "
120 7 1 dim 200 250 327 300 300 3100 100 " b"
121 7 2 matrix 700 800 912 800 900 5200 100 "a "
122 7 2 dim 200 300 328 300 300 3600 100 " b"
123 7 3 matrix 800 900 1055 1000 1050 5800 100 "a "
124 7 3 dim 200 300 542 400 400 7900 100 " b"
125 7 4 matrix 800 900 1096 900 1000 4600 100 "a "
126 7 4 dim 200 300 644 400 400 14500 100 " b"
127 7 5 matrix 800 900 1032 1000 1000 5100 100 "a "
128 7 5 dim 200 300 414 400 400 3900 100 " b"
129 7 6 matrix 800 1100 1749 1300 1900 13400 100 "a "
130 7 6 dim 300 400 671 500 600 4400 100 " b"
131 7 7 matrix 800 900 1114 1000 1000 7900 100 "a "
132 7 7 dim 200 300 643 400 400 7900 100 " b"
133 7 8 matrix 1100 1200 1493 1200 1350 8100 100 "a "
134 7 8 dim 300 400 862 500 500 18600 100 " b"
135 7 9 matrix 800 900 1233 1000 1100 9800 100 "a "
136 7 9 dim 200 400 595 400 400 7700 100 " b"
137 7 10 matrix 800 900 1065 1000 1000 5200 100 "a "
138 7 10 dim 300 300 720 400 400 15500 100 " b"
139 8 1 matrix 700 800 1174 900 1500 7100 100 "a "
140 8 1 dim 200 300 404 300 500 2300 100 " b"
141 8 2 matrix 700 800 942 800 900 7100 100 "a "
142 8 2 dim 200 300 320 300 300 2200 100 " b"
143 8 3 matrix 800 900 1028 900 1000 5700 100 "a "
144 8 3 dim 200 300 527 400 400 9400 100 " b"
145 8 4 matrix 800 900 1077 900 1000 5000 100 "a "
146 8 4 dim 200 300 489 400 400 5300 100 " b"
147 8 5 matrix 800 900 1151 1000 1100 5400 100 "a "
148 8 5 dim 300 300 548 400 400 7200 100 " b"
149 8 6 matrix 800 900 1269 1000 1100 6100 100 "a "
150 8 6 dim 300 300 641 400 400 10800 100 " b"
151 8 7 matrix 800 900 1101 1000 1100 5100 100 "a "
152 8 7 dim 300 300 692 400 400 13400 100 " b"
153 8 8 matrix 800 900 1230 1000 1100 8500 100 "a "
154 8 8 dim 200 300 777 400 400 11000 100 " b"
155 8 9 matrix 800 950 1440 1000 1100 18900 100 "a "
156 8 9 dim 200 300 748 400 400 10200 100 " b"
157 8 10 matrix 800 900 2015 1000 1100 31300 100 "a "
158 8 10 dim 300 300 851 400 500 10700 100 " b"
159 9 1 matrix 700 800 898 800 900 4800 100 "a "
160 9 1 dim 200 250 332 300 300 4000 100 " b"
161 9 2 matrix 800 900 1046 900 1050 5200 100 "a"
162 9 2 dim 200 300 699 400 400 21300 100 "a"
163 9 3 matrix 800 900 1249 1000 1100 10200 100 "a "
164 9 3 dim 200 300 537 400 400 5500 100 " b"
165 9 4 matrix 800 900 1075 1000 1000 8600 100 "a "
166 9 4 dim 200 300 392 400 400 2500 100 " b"
167 9 5 matrix 800 900 1126 1000 1100 4700 100 "a "
168 9 5 dim 200 300 621 400 400 12600 100 " b"
169 9 6 matrix 800 900 1508 1000 1150 21300 100 "a "
170 9 6 dim 300 300 494 400 400 5100 100 " b"
171 9 7 matrix 800 1000 1377 1000 1100 10000 100 "a "
172 9 7 dim 300 300 566 400 450 5100 100 " b"
173 9 8 matrix 800 900 1353 1000 1100 8300 100 "a "
174 9 8 dim 200 300 573 400 400 12600 100 " b"
175 9 9 matrix 800 1000 1593 1100 1300 22500 100 "a "
176 9 9 dim 300 400 689 400 500 6700 100 " b"
177 9 10 matrix 800 900 1408 1000 1150 18900 100 "a "
178 9 10 dim 200 300 672 400 500 7000 100 " b"
179 10 1 matrix 700 800 907 800 900 5100 100 "a "
180 10 1 dim 200 300 327 300 300 3700 100 " b"
181 10 2 matrix 800 900 1212 1000 1200 6900 100 "a "
182 10 2 dim 200 300 583 400 500 7300 100 " b"
183 10 3 matrix 800 900 1044 900 1000 6900 100 "a "
184 10 3 dim 200 300 646 400 400 7900 100 " b"
185 10 4 matrix 800 900 1305 1000 1350 9700 100 "a"
186 10 4 dim 200 300 862 400 550 19400 100 "a"
187 10 5 matrix 800 900 1242 900 1000 14700 100 "a "
188 10 5 dim 200 300 512 400 400 3900 100 " b"
189 10 6 matrix 800 900 1157 1000 1000 7900 100 "a "
190 10 6 dim 200 300 559 400 400 9600 100 " b"
191 10 7 matrix 800 900 1206 1000 1100 9400 100 "a "
192 10 7 dim 200 300 597 400 450 5100 100 " b"
193 10 8 matrix 800 900 1363 1000 1100 8000 100 "a "
194 10 8 dim 200 300 682 400 500 7900 100 " b"
195 10 9 matrix 800 950 1599 1000 1200 22200 100 "a "
196 10 9 dim 200 400 553 400 500 2600 100 " b"
197 10 10 matrix 800 1000 1692 1200 1300 23000 100 "a "
198 10 10 dim 200 400 745 500 600 5900 100 " b"
どの条件でもmatrix()に比べて`dim<-`()の方が2~3倍くらい速いですが、結果の単位はナノ秒なので、1回実行するときには体感できる差はないですね。何万回以上も回すとなると地味に変わってくると思います。
結果のグラフ化も可能です。列数ごとに分割してggplot2::autoplotを使います。microbenchmark::microbenchmark()の戻り値に対してはmicrobenchmark:::autoplot.microbenchmark()が適用されます。
- 1
-
autoplot.microbenchmark()内部の関数がggplot2側でdeprecatedになったものがあるらしく、警告が出ます。 - 2
-
dplyr::group_map()にすると、戻り値でインデックスがレンダリングされるので、dplyr::group_walk()にしてplotだけ無理やり表示させました。
どの条件でも`dim<-`()の方が速いように見受けられます。
bench
最近使い方をなんとなく覚えてきました。bench::mark()はベンチマーク時間を設定できたり、メモリアロケーションも出してくれたりするところがいいです。あと、デフォルトで出力が一致しているかどうかチェックしてくれます。bench::mark()を複数条件で実行したいときはbench::press()を併用します。bench::press()では、パラメーター(条件)を名前付きで指定して、名前なしのexprとして{}の中でbench::mark()を実行するという感じです。普通にやるならこんな感じになると思います。
- 1
-
条件を列挙する。
tidyr::expand_grid()っぽく展開される(けど、中で使っているのはexpand.grid()だった)。 - 2
-
{}の中では単発のbench::mark()っぽく記述すればいいです。
今回は条件のdfをすでに作ってあるので、それを引数.gridに渡せばいいです。
結果は以下の通りです。まとめるのが面倒なのでそのまま出します。
# A tibble: 198 × 15
expression nr nc min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time
<bch:expr> <int> <int> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm>
1 matrix 1 2 900ns 1.1µs 855644. 0B 0 10000 0 11.69ms
2 dim 1 2 300ns 400ns 2223111. 0B 0 10000 0 4.5ms
3 matrix 1 3 900ns 1.1µs 745799. 0B 74.6 9999 1 13.41ms
4 dim 1 3 300ns 400ns 1786959. 0B 0 10000 0 5.6ms
5 matrix 1 4 900ns 1.1µs 831400. 0B 0 10000 0 12.03ms
6 dim 1 4 300ns 400ns 2066927. 0B 0 10000 0 4.84ms
7 matrix 1 5 900ns 1.1µs 873965. 0B 0 10000 0 11.44ms
8 dim 1 5 300ns 400ns 2202207. 0B 0 10000 0 4.54ms
9 matrix 1 6 900ns 1.1µs 738299. 0B 73.8 9999 1 13.54ms
10 dim 1 6 300ns 500ns 1972815. 0B 0 10000 0 5.07ms
11 matrix 1 7 900ns 1.1µs 805932. 0B 0 10000 0 12.41ms
12 dim 1 7 300ns 400ns 2184742. 0B 0 10000 0 4.58ms
13 matrix 1 8 900ns 1.1µs 868123. 0B 0 10000 0 11.52ms
14 dim 1 8 300ns 400ns 1892148. 0B 0 10000 0 5.29ms
15 matrix 1 9 900ns 1.1µs 761480. 0B 76.2 9999 1 13.13ms
16 dim 1 9 300ns 400ns 2076498. 0B 0 10000 0 4.82ms
17 matrix 1 10 900ns 1.1µs 867453. 0B 0 10000 0 11.53ms
18 dim 1 10 300ns 400ns 2061728. 0B 0 10000 0 4.85ms
19 matrix 2 1 900ns 1.2µs 705990. 0B 0 10000 0 14.16ms
20 dim 2 1 300ns 400ns 2163987. 0B 0 10000 0 4.62ms
21 matrix 2 2 900ns 1.6µs 549574. 0B 0 10000 0 18.2ms
22 dim 2 2 300ns 400ns 1888396. 0B 0 10000 0 5.3ms
23 matrix 2 3 800ns 1.1µs 833583. 0B 0 10000 0 12ms
24 dim 2 3 300ns 500ns 1979022. 0B 0 10000 0 5.05ms
25 matrix 2 4 900ns 1.1µs 829841. 0B 0 10000 0 12.05ms
26 dim 2 4 300ns 500ns 2078311. 0B 0 10000 0 4.81ms
27 matrix 2 5 900ns 1.2µs 817341. 0B 0 10000 0 12.23ms
28 dim 2 5 300ns 400ns 2114299. 0B 0 10000 0 4.73ms
29 matrix 2 6 900ns 1.7µs 485424. 0B 48.5 9999 1 20.6ms
30 dim 2 6 300ns 400ns 2104510. 0B 0 10000 0 4.75ms
31 matrix 2 7 900ns 1.2µs 797715. 0B 0 10000 0 12.54ms
32 dim 2 7 300ns 500ns 1918134. 0B 0 10000 0 5.21ms
33 matrix 2 8 900ns 1.1µs 836030. 0B 0 10000 0 11.96ms
34 dim 2 8 300ns 400ns 2153409. 0B 0 10000 0 4.64ms
35 matrix 2 9 900ns 1.2µs 794729. 192B 0 10000 0 12.58ms
36 dim 2 9 300ns 500ns 1753955. 192B 0 10000 0 5.7ms
37 matrix 2 10 900ns 1.6µs 553970. 208B 55.4 9999 1 18.05ms
38 dim 2 10 300ns 500ns 1750700. 208B 0 10000 0 5.71ms
39 matrix 3 1 900ns 1.1µs 875726. 0B 0 10000 0 11.42ms
40 dim 3 1 300ns 400ns 2240796. 0B 0 10000 0 4.46ms
41 matrix 3 2 900ns 1.1µs 799380. 0B 0 10000 0 12.51ms
42 dim 3 2 300ns 400ns 2139175. 0B 0 10000 0 4.67ms
43 matrix 3 3 900ns 1.1µs 873767. 0B 0 10000 0 11.45ms
44 dim 3 3 300ns 400ns 2173015. 0B 0 10000 0 4.6ms
45 matrix 3 4 900ns 1.3µs 671092. 0B 67.1 9999 1 14.9ms
46 dim 3 4 300ns 700ns 1502426. 0B 0 10000 0 6.66ms
47 matrix 3 5 900ns 1.1µs 870095. 0B 0 10000 0 11.49ms
48 dim 3 5 300ns 500ns 2092050. 0B 0 10000 0 4.78ms
49 matrix 3 6 900ns 1.1µs 832723. 192B 0 10000 0 12.01ms
50 dim 3 6 300ns 500ns 2002323. 192B 0 10000 0 4.99ms
51 matrix 3 7 900ns 1.2µs 812869. 216B 0 10000 0 12.3ms
52 dim 3 7 300ns 500ns 1963017. 216B 0 10000 0 5.09ms
53 matrix 3 8 900ns 1.2µs 685812. 240B 68.6 9999 1 14.58ms
54 dim 3 8 300ns 700ns 1480473. 240B 0 10000 0 6.75ms
55 matrix 3 9 900ns 1.2µs 702163. 264B 0 10000 0 14.24ms
56 dim 3 9 300ns 500ns 1861158. 264B 0 10000 0 5.37ms
57 matrix 3 10 900ns 1.2µs 807011. 288B 0 10000 0 12.39ms
58 dim 3 10 300ns 500ns 1878993. 288B 0 10000 0 5.32ms
59 matrix 4 1 900ns 1.1µs 887437. 0B 0 10000 0 11.27ms
60 dim 4 1 300ns 400ns 2248353. 0B 0 10000 0 4.45ms
61 matrix 4 2 900ns 1.1µs 844431. 0B 0 10000 0 11.84ms
62 dim 4 2 300ns 600ns 1552977. 0B 155. 9999 1 6.44ms
63 matrix 4 3 800ns 1.2µs 655476. 0B 0 10000 0 15.26ms
64 dim 4 3 300ns 400ns 2146890. 0B 0 10000 0 4.66ms
65 matrix 4 4 900ns 1.1µs 866469. 0B 0 10000 0 11.54ms
66 dim 4 4 300ns 400ns 2351226. 0B 0 10000 0 4.25ms
67 matrix 4 5 900ns 1.1µs 828555. 208B 0 10000 0 12.07ms
68 dim 4 5 300ns 500ns 2014058. 208B 0 10000 0 4.96ms
69 matrix 4 6 900ns 1.2µs 818311. 240B 0 10000 0 12.22ms
70 dim 4 6 300ns 500ns 1861561. 240B 186. 9999 1 5.37ms
71 matrix 4 7 900ns 1.5µs 576784. 272B 0 10000 0 17.34ms
72 dim 4 7 300ns 500ns 1969202. 272B 0 10000 0 5.08ms
73 matrix 4 8 900ns 1.2µs 814060. 304B 0 10000 0 12.28ms
74 dim 4 8 300ns 500ns 1852469. 304B 0 10000 0 5.4ms
75 matrix 4 9 900ns 1.2µs 795083. 336B 0 10000 0 12.58ms
76 dim 4 9 300ns 500ns 1622240. 336B 162. 9999 1 6.16ms
77 matrix 4 10 900ns 1.4µs 584426. 368B 0 10000 0 17.11ms
78 dim 4 10 300ns 500ns 1901574. 368B 0 10000 0 5.26ms
79 matrix 5 1 800ns 1.1µs 869127. 0B 0 10000 0 11.51ms
80 dim 5 1 300ns 400ns 2165065. 0B 0 10000 0 4.62ms
81 matrix 5 2 900ns 1.1µs 869853. 0B 0 10000 0 11.5ms
82 dim 5 2 300ns 400ns 2168915. 0B 0 10000 0 4.61ms
83 matrix 5 3 800ns 1.5µs 593159. 0B 0 10000 0 16.86ms
84 dim 5 3 300ns 400ns 2192886. 0B 0 10000 0 4.56ms
85 matrix 5 4 900ns 1.2µs 823045. 208B 0 10000 0 12.15ms
86 dim 5 4 300ns 500ns 1971142. 208B 0 10000 0 5.07ms
87 matrix 5 5 900ns 1.2µs 787185. 248B 0 10000 0 12.7ms
88 dim 5 5 300ns 500ns 1962863. 248B 0 10000 0 5.09ms
89 matrix 5 6 900ns 1.7µs 536850. 288B 53.7 9999 1 18.62ms
90 dim 5 6 300ns 500ns 1946775. 288B 0 10000 0 5.14ms
91 matrix 5 7 900ns 1.2µs 815754. 328B 0 10000 0 12.26ms
92 dim 5 7 300ns 500ns 1912338. 328B 0 10000 0 5.23ms
93 matrix 5 8 900ns 1.2µs 782486. 368B 78.3 9999 1 12.78ms
94 dim 5 8 300ns 700ns 1430718. 368B 0 10000 0 6.99ms
95 matrix 5 9 900ns 1.3µs 634461. 408B 0 10000 0 15.76ms
96 dim 5 9 300ns 500ns 1856596. 408B 0 10000 0 5.39ms
97 matrix 5 10 900ns 1.1µs 817720. 448B 81.8 9999 1 12.23ms
98 dim 5 10 300ns 400ns 2044446. 448B 0 10000 0 4.89ms
99 matrix 6 1 900ns 1µs 999370. 0B 0 10000 0 10.01ms
100 dim 6 1 300ns 400ns 2600239. 0B 0 10000 0 3.85ms
101 matrix 6 2 800ns 1µs 990158. 0B 0 10000 0 10.1ms
102 dim 6 2 300ns 400ns 2651887. 0B 0 10000 0 3.77ms
103 matrix 6 3 900ns 1µs 905215. 192B 0 10000 0 11.05ms
104 dim 6 3 300ns 400ns 2092532. 192B 0 10000 0 4.78ms
105 matrix 6 4 900ns 1.1µs 877039. 240B 0 10000 0 11.4ms
106 dim 6 4 300ns 400ns 2109082. 240B 0 10000 0 4.74ms
107 matrix 6 5 900ns 1.1µs 880987. 288B 0 10000 0 11.35ms
108 dim 6 5 300ns 400ns 2132333. 288B 0 10000 0 4.69ms
109 matrix 6 6 900ns 1.1µs 850660. 336B 85.1 9999 1 11.75ms
110 dim 6 6 300ns 400ns 2103049. 336B 0 10000 0 4.75ms
111 matrix 6 7 900ns 1.1µs 883213. 384B 0 10000 0 11.32ms
112 dim 6 7 300ns 400ns 2017268. 384B 0 10000 0 4.96ms
113 matrix 6 8 900ns 1.1µs 819746. 432B 0 10000 0 12.2ms
114 dim 6 8 300ns 400ns 1988744. 432B 0 10000 0 5.03ms
115 matrix 6 9 900ns 1.1µs 845537. 480B 0 10000 0 11.83ms
116 dim 6 9 300ns 500ns 1880017. 480B 0 10000 0 5.32ms
117 matrix 6 10 900ns 1.1µs 857780. 528B 0 10000 0 11.66ms
118 dim 6 10 300ns 400ns 2009808. 528B 0 10000 0 4.98ms
119 matrix 7 1 800ns 1µs 941380. 0B 0 10000 0 10.62ms
120 dim 7 1 300ns 400ns 2291371. 0B 0 10000 0 4.36ms
121 matrix 7 2 900ns 1µs 921881. 0B 92.2 9999 1 10.85ms
122 dim 7 2 300ns 400ns 2362949. 0B 0 10000 0 4.23ms
123 matrix 7 3 900ns 1.1µs 820755. 216B 0 10000 0 12.18ms
124 dim 7 3 300ns 400ns 1867762. 216B 0 10000 0 5.35ms
125 matrix 7 4 900ns 1µs 830903. 272B 0 10000 0 12.04ms
126 dim 7 4 300ns 400ns 1866891. 272B 0 10000 0 5.36ms
127 matrix 7 5 900ns 1.1µs 839525. 328B 0 10000 0 11.91ms
128 dim 7 5 300ns 400ns 2070136. 328B 0 10000 0 4.83ms
129 matrix 7 6 900ns 1.1µs 854058. 384B 0 10000 0 11.71ms
130 dim 7 6 300ns 400ns 1954270. 384B 0 10000 0 5.12ms
131 matrix 7 7 900ns 1.1µs 802053. 440B 0 10000 0 12.47ms
132 dim 7 7 300ns 500ns 1722416. 440B 0 10000 0 5.81ms
133 matrix 7 8 900ns 1.1µs 807106. 496B 80.7 9999 1 12.39ms
134 dim 7 8 300ns 400ns 1899371. 496B 0 10000 0 5.26ms
135 matrix 7 9 900ns 1.1µs 872106. 552B 0 10000 0 11.47ms
136 dim 7 9 300ns 500ns 1827352. 552B 0 10000 0 5.47ms
137 matrix 7 10 900ns 1.1µs 783828. 608B 0 10000 0 12.76ms
138 dim 7 10 300ns 500ns 1871328. 608B 0 10000 0 5.34ms
139 matrix 8 1 900ns 1µs 915039. 0B 0 10000 0 10.93ms
140 dim 8 1 300ns 400ns 2338251. 0B 0 10000 0 4.28ms
141 matrix 8 2 900ns 1µs 927489. 0B 0 10000 0 10.78ms
142 dim 8 2 300ns 400ns 2413011. 0B 0 10000 0 4.14ms
143 matrix 8 3 900ns 1.1µs 833952. 240B 0 10000 0 11.99ms
144 dim 8 3 300ns 400ns 1856252. 240B 0 10000 0 5.39ms
145 matrix 8 4 900ns 1.1µs 824083. 304B 0 10000 0 12.13ms
146 dim 8 4 300ns 400ns 1960400. 304B 0 10000 0 5.1ms
147 matrix 8 5 900ns 1.1µs 804855. 368B 0 10000 0 12.43ms
148 dim 8 5 300ns 500ns 1750578. 368B 0 10000 0 5.71ms
149 matrix 8 6 900ns 1.1µs 800935. 432B 0 10000 0 12.48ms
150 dim 8 6 300ns 500ns 1854015. 432B 0 10000 0 5.39ms
151 matrix 8 7 900ns 1.1µs 829951. 496B 0 10000 0 12.05ms
152 dim 8 7 300ns 500ns 1847473. 496B 0 10000 0 5.41ms
153 matrix 8 8 900ns 1.1µs 843490. 560B 0 10000 0 11.86ms
154 dim 8 8 300ns 500ns 1732148. 560B 173. 9999 1 5.77ms
155 matrix 8 9 900ns 1.1µs 837661. 624B 0 10000 0 11.94ms
156 dim 8 9 300ns 500ns 1812875. 624B 0 10000 0 5.52ms
157 matrix 8 10 900ns 1.1µs 772642. 688B 0 10000 0 12.94ms
158 dim 8 10 300ns 500ns 1763855. 688B 0 10000 0 5.67ms
159 matrix 9 1 800ns 1µs 944118. 0B 0 10000 0 10.59ms
160 dim 9 1 300ns 400ns 2385952. 0B 0 10000 0 4.19ms
161 matrix 9 2 900ns 1µs 814817. 192B 0 10000 0 12.27ms
162 dim 9 2 300ns 500ns 1852538. 192B 0 10000 0 5.4ms
163 matrix 9 3 900ns 1.1µs 817862. 264B 0 10000 0 12.23ms
164 dim 9 3 300ns 400ns 2041275. 264B 0 10000 0 4.9ms
165 matrix 9 4 900ns 1.1µs 779910. 336B 0 10000 0 12.82ms
166 dim 9 4 300ns 400ns 1860846. 336B 0 10000 0 5.37ms
167 matrix 9 5 900ns 1.1µs 785540. 408B 0 10000 0 12.73ms
168 dim 9 5 300ns 500ns 1829592. 408B 0 10000 0 5.47ms
169 matrix 9 6 900ns 1.1µs 809310. 480B 0 10000 0 12.36ms
170 dim 9 6 300ns 500ns 1742798. 480B 0 10000 0 5.74ms
171 matrix 9 7 900ns 1.1µs 759261. 552B 0 10000 0 13.17ms
172 dim 9 7 300ns 500ns 1784790. 552B 0 10000 0 5.6ms
173 matrix 9 8 900ns 1.1µs 812242. 624B 0 10000 0 12.31ms
174 dim 9 8 300ns 500ns 1724346. 624B 0 10000 0 5.8ms
175 matrix 9 9 900ns 1.1µs 738874. 696B 0 10000 0 13.53ms
176 dim 9 9 300ns 500ns 1725268. 696B 0 10000 0 5.8ms
177 matrix 9 10 900ns 1.1µs 767177. 768B 0 10000 0 13.04ms
178 dim 9 10 300ns 500ns 1914967. 768B 192. 9999 1 5.22ms
179 matrix 10 1 800ns 1µs 940230. 0B 0 10000 0 10.64ms
180 dim 10 1 300ns 400ns 2262699. 0B 0 10000 0 4.42ms
181 matrix 10 2 900ns 1.1µs 816727. 208B 0 10000 0 12.24ms
182 dim 10 2 300ns 400ns 2033430. 208B 0 10000 0 4.92ms
183 matrix 10 3 900ns 1.1µs 796775. 288B 0 10000 0 12.55ms
184 dim 10 3 300ns 400ns 2015723. 288B 0 10000 0 4.96ms
185 matrix 10 4 900ns 1.1µs 826665. 368B 0 10000 0 12.1ms
186 dim 10 4 300ns 500ns 1820366. 368B 0 10000 0 5.49ms
187 matrix 10 5 900ns 1.1µs 803168. 448B 0 10000 0 12.45ms
188 dim 10 5 300ns 500ns 1865033. 448B 187. 9999 1 5.36ms
189 matrix 10 6 900ns 1.1µs 760861. 528B 0 10000 0 13.14ms
190 dim 10 6 300ns 500ns 1781547. 528B 0 10000 0 5.61ms
191 matrix 10 7 900ns 1.1µs 783730. 608B 0 10000 0 12.76ms
192 dim 10 7 300ns 500ns 1751498. 608B 0 10000 0 5.71ms
193 matrix 10 8 900ns 1.1µs 791459. 688B 0 10000 0 12.63ms
194 dim 10 8 300ns 500ns 1731009. 688B 173. 9999 1 5.78ms
195 matrix 10 9 900ns 1.1µs 770897. 768B 0 10000 0 12.97ms
196 dim 10 9 300ns 500ns 1804631. 768B 0 10000 0 5.54ms
197 matrix 10 10 900ns 1.1µs 718133. 848B 0 10000 0 13.93ms
198 dim 10 10 300ns 500ns 1531628. 848B 0 10000 0 6.53ms
# ℹ 4 more variables: result <list>, memory <list>, time <list>, gc <list>
結果は先ほどと変わらず、単位は相変わらずナノ秒とか1桁マイクロ秒ですが、どの条件でもmatrix()より`dim<-`()の方が2~3倍くらい速いです。
こちらも結果のグラフ化が可能です。先ほどと同じくautoplot()で自動的に出来上がります。bench::mark()の戻り値にはbench:::autoplot.bench_mark()が適用されます。
res_bm |>
dplyr::filter(nr == 1) |>
1 ggplot2::autoplot()- 1
-
引数
typeで描画方法をいろいろ指定できます。ただし、デフォルトの"beeswarm"はggbeeswarmパッケージ、"ridge"はggridgesパッケージが必要です。インストールされてない場合は、インストールするかどうか聞いてきます。

条件がいくつかある場合は自動でfacetに分けてくれるようです。ただこのまま列に条件がすべて入るとちょっと見にくいので、これも行ごとに分割してもう少し見やすくしてみます。内部ですでにggplot2::facet_*()が使われているのですが、上書きしてしまいます。2
res_bm |>
tidyr::nest(.by = nr) |>
dplyr::mutate(
data = purrr::set_names(data, paste0("nr: ", nr))
) |>
1 dplyr::pull(data) |>
purrr::iwalk(
.f = \(x, idx) {
temp_p <- ggplot2::autoplot(x, size = 1) +
ggplot2::facet_wrap(
ggplot2::vars(nc),
ncol = 5,
labeller = ggplot2::labeller(nc = ggplot2::label_both)
) +
ggplot2::labs(title = idx) +
ggplot2::theme_bw()
print(temp_p)
}
)- 1
-
dplyr::group_map()でやろうとすると、bench:::autoplot.bench_mark(obj, type = "beeswarm")でエラーを吐くのでdplyr::pull() |> purrr::iwalk()にしました。
どの条件でも`dim<-`()の方が速いですね。
Supplyment
chr
念のため文字型でもやってみます。時間削減で10行だけやります。文字列は一文字のベクトルであるlettersでもよかったんですが、せっかくなので短めの文章が集められているstringr::sentencesを使ってみたいと思います。
# A tibble: 20 × 8
expression nr nc min median `itr/sec` mem_alloc `gc/sec`
<bch:expr> <int> <int> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
1 matrix 10 1 900ns 1.1µs 847063. 0B 0
2 dim 10 1 300ns 400ns 2247393. 0B 0
3 matrix 10 2 1µs 1.2µs 818304. 208B 0
4 dim 10 2 300ns 500ns 2052840. 208B 0
5 matrix 10 3 1µs 1.2µs 756125. 288B 75.6
6 dim 10 3 300ns 400ns 2034340. 288B 0
7 matrix 10 4 1µs 1.2µs 761475. 368B 0
8 dim 10 4 300ns 500ns 1978122. 368B 0
9 matrix 10 5 1µs 1.2µs 745590. 448B 0
10 dim 10 5 300ns 500ns 1758582. 448B 0
11 matrix 10 6 1.1µs 1.3µs 713903. 528B 0
12 dim 10 6 300ns 500ns 1894226. 528B 0
13 matrix 10 7 1.1µs 1.3µs 700467. 608B 0
14 dim 10 7 300ns 500ns 1896813. 608B 0
15 matrix 10 8 1.1µs 1.3µs 710787. 688B 71.1
16 dim 10 8 300ns 500ns 1820002. 688B 0
17 matrix 10 9 1.2µs 1.4µs 664651. 768B 0
18 dim 10 9 400ns 500ns 1774717. 768B 0
19 matrix 10 10 1.2µs 1.4µs 646567. 848B 0
20 dim 10 10 300ns 500ns 1613554. 848B 0
文字型でも`dim<-`()の方が速いですね。
logical
論理値も念のため。
# A tibble: 20 × 8
expression nr nc min median `itr/sec` mem_alloc `gc/sec`
<bch:expr> <int> <int> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
1 matrix 10 1 900ns 1µs 943743. 0B 0
2 dim 10 1 300ns 400ns 2323728. 0B 232.
3 matrix 10 2 900ns 1µs 950218. 0B 0
4 dim 10 2 300ns 400ns 2403673. 0B 0
5 matrix 10 3 900ns 1µs 883994. 0B 0
6 dim 10 3 300ns 400ns 2407956. 0B 0
7 matrix 10 4 900ns 1.1µs 865516. 208B 0
8 dim 10 4 300ns 400ns 2052208. 208B 0
9 matrix 10 5 900ns 1.1µs 851151. 248B 0
10 dim 10 5 300ns 500ns 2023841. 248B 0
11 matrix 10 6 900ns 1.1µs 857672. 288B 85.8
12 dim 10 6 300ns 400ns 2097447. 288B 0
13 matrix 10 7 900ns 1.1µs 852057. 328B 0
14 dim 10 7 300ns 400ns 2031282. 328B 0
15 matrix 10 8 900ns 1.1µs 864970. 368B 0
16 dim 10 8 300ns 400ns 1949242. 368B 0
17 matrix 10 9 900ns 1.1µs 837261. 408B 0
18 dim 10 9 300ns 500ns 1995490. 408B 0
19 matrix 10 10 900ns 1.1µs 846196. 448B 0
20 dim 10 10 300ns 400ns 2011627. 448B 0
論理値型でも`dim<-`()の方が速いですね。
Conclusion
ベクトルから行列を作るときの速さをmatrix()と`dim<-`()で比べてみました。1×1を除く10×10の行列の作成までベンチマークを回してみましたが、matrix()は大体1~1.1マイクロ秒、`dim<-`()は大体0.4~0.5マイクロ秒ということで、後者の方が速かったです。
…といっても普段の分析で使うときに体感できる差ではないので、ふつうに使うなら分かりやすいし行方向にも値を入れられるmatrix()を使うのがいいと思います。シミュレーションで行列を大量に作る際に、要素をbyrowで入れる必要がなく少しでも時間を節約したいなら`dim<-`()を使うのもいいかもしれません。(でも、おそらく他の部分とか関数の方がボトルネックになると思います…。)
Session Information
R version 4.5.3 (2026-03-11 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26100)
Matrix products: default
LAPACK version 3.12.1
locale:
[1] LC_COLLATE=Japanese_Japan.utf8 LC_CTYPE=Japanese_Japan.utf8 LC_MONETARY=Japanese_Japan.utf8
[4] LC_NUMERIC=C LC_TIME=Japanese_Japan.utf8
time zone: Asia/Tokyo
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] bench_1.1.4 microbenchmark_1.5.0 lubridate_1.9.5 forcats_1.0.1
[5] stringr_1.6.0 dplyr_1.2.1 purrr_1.2.2 readr_2.2.0
[9] tidyr_1.3.2 tibble_3.3.1 ggplot2_4.0.3 tidyverse_2.0.0
loaded via a namespace (and not attached):
[1] utf8_1.2.6 sandwich_3.1-3 generics_0.1.4 stringi_1.8.9 lattice_0.22-9
[6] hms_1.1.4 digest_0.6.39 magrittr_2.0.5 evaluate_1.0.5 grid_4.5.3
[11] timechange_0.4.0 RColorBrewer_1.1-3 mvtnorm_1.4-2 fastmap_1.2.0 Matrix_1.7-6
[16] jsonlite_2.0.0 survival_3.8-9 multcomp_1.4-31 scales_1.4.0 TH.data_1.1-5
[21] codetools_0.2-20 textshaping_1.0.5 cli_3.6.6 rlang_1.3.0 splines_4.5.3
[26] withr_3.0.3 yaml_2.3.12 otel_0.2.0 ggbeeswarm_0.7.3 tools_4.5.3
[31] tzdb_0.5.0 profmem_0.7.0 pacman_0.5.1 vctrs_0.7.3 R6_2.6.1
[36] zoo_1.9-0 lifecycle_1.0.5 htmlwidgets_1.6.4 vipor_0.4.7 MASS_7.3-66
[41] ragg_1.5.2 beeswarm_0.4.0 pkgconfig_2.0.3 pillar_1.11.1 gtable_0.3.6
[46] glue_1.8.1 systemfonts_1.3.2 xfun_0.60 tidyselect_1.2.1 rstudioapi_0.19.0
[51] knitr_1.51 farver_2.1.2 patchwork_1.3.2 htmltools_0.5.9 rmarkdown_2.31
[56] labeling_0.4.3 compiler_4.5.3 S7_0.2.2
Change Log
- 2026-04-15
microbenchmarkの結果をtbl_df化。プロットをlightboxに対応。
- 2026-08-15
- 変更
- サムネイル
- 修正
- typo
- 変更
Footnotes
f(x) <- valueみたいな書き方をする関数には、結構この記法(`f<-`(x, value))に対応しているものがあります。代入演算子(<-)まで含めて関数の名前になっているので、関数名を必ずバッククォート記号(`、backtickとも言うみたい)で囲む必要があります。コード補完をオンにしていると、候補に出てきます。↩︎ほとんどの条件で実行回数(n_iter)が上限の1万回に達しているからか、beeswarmの処理にやたら時間がかかる気がします。
"violin"とか"boxplot"だと処理が速いです。"jitter"も重かったです。"ridge"は割と速かったのですが、今回のデータだと"violin"の方が見やすかったです。↩︎



















