Номер месяца

UPDATE: Добавил пример с Dictionary, который оказался хоть и не на много, но быстрее.

Вроде бы тривиальная задача — есть трехбуквенное имя месяца ( Jan, Feb, Mar… ) и из него нужно получить номер месяца. Небольшой поиск готовых велосипедов под рукой ни к чему не привел, так что придется написать небольшой хелпер для дальнейшего использования. Самый простой вариант — Array.indexOf из массива названий в порядке следования месяцов. А можно еще искать вручную или индекс подстроки в строке. Так все же, как делать?

Пришлось составить небольшой бенчмарк.

var arr: Array = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"];
var str: String = "JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC";
var dic: Dictionary = new Dictionary();
dic["JAN"] = 0;
dic["FEB"] = 1;
dic["MAR"] = 2;
dic["APR"] = 3;
dic["MAY"] = 4;
dic["JUN"] = 5;
dic["JUL"] = 6;
dic["AUG"] = 7;
dic["SEP"] = 8;
dic["OCT"] = 9;
dic["NOV"] = 10;
dic["DEC"] = 11;

function testArr( s: String ): int
{
	return arr.indexOf( s.toUpperCase() );
}

function testArr2( s: String ): int
{
	var i: int = 0;
	s = s.toUpperCase();
	for ( i = 0; i < 12; i++ )
		if ( arr[i] == s ) return i;
	return -1;
}

function testStr( s: String ): int
{
	var i: int = str.indexOf( s.toUpperCase() );
	if ( i == -1 )
		return -1;
	return i >> 2;
}

function testDic( s: String ): int
{
	return dic[s.toUpperCase()];
}

Каждая функция вызывалась 10 раз по 100 000 раз для каждого месяца и полученное значение в ms усреднялось. В итоге получился следующий график.

graph1

Меньше — лучше. X — номер месяца. Y — время выполнения.

СИНИЙ — Array.indexOf
КРАСНЫЙ — Ручной поиск по массиву
ЗЕЛЕНЫЙ — Поиск в строке
ФИОЛЕТОВЫЙ — Dictionary

Из полученных результатов видно, что для поставленной задачи больше подходят примеры со строкой и словарем. Ручной поиск приближается по времени, а Array.indexOf, похоже, занимается каким-то избыточным сравнением (=== ?) и в данном случае работает слишком медленно.

3 Responses to “Номер месяца”


  • что такое “i &lt” во втором методе? точнее lt и откуда он берётся? и почему нету тестов с хешом?

    • Valentin Vladimirovich

      это знак меньше — хтмлный косячок прокрался
      хэш — Dictionary?

  • Dictionary != хэш. Он нужен там, где ключами являются сложные типы, а не обычные строки. для строковых ключей, как бы хватает Object.

Leave a Reply