数値を文字に変換するときにふと気になったのでやってみた。
気になったら業務時間中でも気にせず実験します。
だってエンジニアだもの。
候補
- キャストするよ
- strvalするよ
- 空文字結合するよ
言語問わずよくある子たちですね!
環境
CentOS Linux release 7.3.1611 (Core)
PHP 7.0.15 (cli) (built: Jan 17 2017 17:10:58) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
よくあるLAMP環境です!
結論
1位 227 nsec/1process キャストするよ
2位 264 nsec/1process strvalするよ
3位 378 nsec/1process 空文字結合するよ
せっかちなので結論から行くスタイル。
1億回の処理時間から平均を算出。
キャストが最速。空文字結合は1.5倍程度かかる。
結果詳細
テストコード
自機でやってみたい人はどうぞ。
<?php
// 時間計測が得意なフレンズ
function calc_time($target_func, $count)
{
$begin = microtime(true);
$target_func($count);
$end = microtime(true);
return $end-$begin;
}
// strvalが得意なフレンズ
function loop_strval($count = 10000)
{
$i = 123456789;
for ($i=0; $i < $count; $i++) {
$val = strval($i);
}
}
// 空文字結合が得意なフレンズ
function loop_addstr($count = 10000)
{
$i = 123456789;
for ($i=0; $i < $count; $i++) {
$val = ''.$i;
}
}
// キャストが得意なフレンズ
function loop_convstr($count = 10000)
{
$i = 123456789;
for ($i=0; $i < $count; $i++) {
$val = (string)$i;
}
}
// 挑戦者たち
$entries = [
'loop_strval',
'loop_addstr',
'loop_convstr',
];
// カンマ区切りでとりあえず出力(適当)
for ($i=0; $i < 9; $i++) {
$count = 10 ** $i;
echo "{$count},";
foreach ($entries as $entry) {
$result = calc_time($entry, $count);
$average = $result / $count;
echo "{$result},";
}
echo "\n";
}