拡張子取得 速度テスト

結論から云うと、素直に lastIndexOf() でドットの位置を取得して slice() か substr() するのが一番早いです……。

【関連】拡張子&ベースネーム取得の速度テスト

[2017/04/23]

… ファイル名 : 漢字表記.txt.xhtml

… ファイル名 : 漢字表記

… ファイル名 : .xhtml

… ファイル名 : 漢字表記.txt

上の「計測開始」ボタンをクリックすると、ここに結果が表示されます。

※計測のタイミングにより、ある処理だけ過度に時間がかかる場合があるので、何度か計測して傾向をご確認ください。

 (ブラウザによる最適化のせいか、各処理の順番次第で結果が変わる場合も。

  最初に計測した同じ処理のほうが時間かかりがちの傾向が……)。


// 以下が計測対象の各処理(それぞれ10万回繰り返す)

// ※ドットで始まるファイル名を隠しファイル等として特別に扱うことはしない。

// var name = fileName;



// 01: lastIndexOf() + substr()
// ----------------------------------------
var idx = name.lastIndexOf('.');
if (idx !== -1) {
  extension = name.substr(idx + 1);
}


// 02: lastIndexOf() + slice()
// ----------------------------------------
var idx = name.lastIndexOf('.');
if (idx !== -1) {
  extension = name.slice(idx + 1);
}


// 03: split() + length
// ----------------------------------------
var arr = name.split('.') ;
if (arr.length !== 1) {
  extension = arr[arr.length - 1];
}


// 04: split() + pop()
// ----------------------------------------
var arr = name.split('.') ;
if (arr.length !== 1) {
  extension = arr.pop();
}


// 05: lastIndexOf() + split() + pop()
// ----------------------------------------
if (name.lastIndexOf('.') !== -1) {
  extension = name.split('.').pop();
}


// 06: lastIndexOf() + match()
// ----------------------------------------
if (name.lastIndexOf('.') !== -1) {
  extension = name.match(/(.*)\.([^.]*$)/)[2];
}


// 07: test + match
// ----------------------------------------
if (/\./.test(name)) {
  extension = name.match(/(.*)\.([^.]*$)/)[2];
}


// 08: lastIndexOf() + replace()
// ----------------------------------------
if (name.lastIndexOf('.') !== -1) {
  extension = name.replace(/(.*\.)([^.]+$)/, '$2');
}


// 09: test() + replace()
// ----------------------------------------
if (/\./.test(name)) {
  extension = name.replace(/(.*\.)([^.]+$)/, '$2');
}


// 10: lastIndexOf() + substr() 【※ 01 を再計測】
// ----------------------------------------
var idx = name.lastIndexOf('.');
if (idx !== -1) {
  extension = name.substr(idx + 1);
}



// 上記の各処理をこんなテンプレの中に入れて計測
// ----------------------------------------
var startTime;
var endTime;
var name = fileName;

startTime = new Date();
var extensionXX = (function() {  // XX は 01 ~ の各番号
  var extension;
  for (var i = 0; i < 100000; i++) {

    // ここに計測したい処理を記述

  }
  return extension;
}());
endTime = new Date();
var timeXX = endTime - startTime + ' ms';