気になったので試してみた感じ php://memory
などが異様に遅くなるのは Windows 特有のようです。
下記はいずれも PHP 5.6.3 で、CentOS 6 は remi-56 のバイナリ、Windows 7 は公式の x64 nts のバイナリで、-n
オプション付きで実行しています。
(CentOS 6 はディスクイメージが iSCSI の先にある HDD 上のファイルな仮想環境なので I/O が普通より遅いかもです )
変数に追記
lang
1<?php
2$m = microtime(true);
3
4$a = "";
5for ($i=0; $i<100; $i++) {
6 $a .= str_repeat("x", 1024*1024);
7}
8unset($a);
9
10var_dump(microtime(true) - $m);
11var_dump(memory_get_peak_usage());
12
13// CentOS 6
14// float(0.051472187042236)
15// int(106134088)
16
17// Windows 7
18// float(3.6982111930847)
19// int(106144824)
php://memory に追記
lang
1<?php
2$m = microtime(true);
3
4$fp = fopen("php://memory", "r+b");
5for ($i=0; $i<100; $i++) {
6 fwrite($fp, str_repeat("x", 1024*1024));
7}
8fclose($fp);
9unset($fp);
10
11var_dump(microtime(true) - $m);
12var_dump(memory_get_peak_usage());
13
14// CentOS 6
15// float(0.049097061157227)
16// int(106135176)
17
18// Windows 7
19// float(14.518830060959)
20// int(106146232)
HDD上のファイルに追記
lang
1<?php
2$m = microtime(true);
3
4$fp = tmpfile();
5for ($i=0; $i<100; $i++) {
6 fwrite($fp, str_repeat("x", 1024*1024));
7}
8fclose($fp);
9unset($fp);
10
11var_dump(microtime(true) - $m);
12var_dump(memory_get_peak_usage());
13
14// CentOS 6
15// float(1.1221830844879)
16// int(1277448)
17
18// Windows 7
19// float(0.20701193809509)
20// int(1288560)
tmpfs上のファイルに追記(CentOS のみ)
lang
1<?php
2$m = microtime(true);
3
4$fn = tempnam("/dev/shm/", "xxx");
5$fp = fopen($fn, "r+b");
6for ($i=0; $i<100; $i++) {
7 fwrite($fp, str_repeat("x", 1024*1024));
8}
9fclose($fp);
10unset($fp);
11unlink($fn);
12
13var_dump(microtime(true) - $m);
14var_dump(memory_get_peak_usage());
15
16// CentOS 6
17// float(0.046942949295044)
18// int(1278472)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/11/28 03:57