Эффективность JavaScript при циклировании массивов большой емкости неудовлетворительна. Однажды я провел сравнение. По сравнению с массивами VBS, скорость цикла массива VBS примерно на порядок выше, чем у JS ( http://community.csdn.net/Expert/TopicView. asp?id=4313487 ). Мы не уделяем особого внимания эффективности JS-массивов в общем программировании: вы даже не можете определить эффективность массива, состоящего всего из нескольких десятков элементов, но количество узлов велико, например, тысячи или десятки тысяч. Если используется большое количество циклов массива, проблема эффективности становится основной проблемой, которую следует учитывать. Извлечение массивов большой емкости обычно имеет следующие применения: быстрое сопоставление при выборе полей со списком, древовидные запросы, сортировка или поиск таблиц и т. д.
Позвольте мне провести тест. Сначала я создаю массив большой емкости:
<SCRIPT LANGUAGE="JavaScript">.
var n = 100000 //Максимальная емкость массива;
вар а = новый массив ();
for(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
</SCRIPT>
Таким образом я создал массив символов длиной 100000, а затем получил строку, начинающуюся с 0,9999, и сохранил ее в другом массиве.
<SCRIPT LANGUAGE="JavaScript">
var n = 100000 //Максимальная емкость массива;
вар а = новый массив ();
for(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
вар начало = новая дата().getTime();
вар б = новый массив ();
for(var i=0; i<n; i++)
{
if(a[i].indexOf("0,9999")==0)
{
б[b.длина] = а[я];
}
}
document.write("Длина массива: "+ n);
document.write("<br>Традиционный метод цикла требует времени" + (new Date().getTime() - начало)
+" миллисекунды! Результаты получения: <strong title=""+ b.join(" ")
+"'>Получено записей "+ b.length +"!</strong>");
</SCRIPT>
Этот этап операции занимает около 2800 миллисекунд. Если объяснить, то цикл здесь очень простой. Здесь есть только суждение if и операция присваивания. Если суждение здесь немного сложнее, потребуется больше времени, это будет на порядок больше. Итак, есть ли хорошие решения по оптимизации этой проблемы? Ответ, конечно, да, иначе все, что я сказал бы в этом посте, было бы пустой тратой слов. Но мы больше не можем использовать наше традиционное мышление для оптимизации этой проблемы, потому что в традиционном мышлении невозможно найти лучшего способа письма.
Решение такое: сначала объедините() массив в большую строку, а затем используйте регулярные выражения для сопоставления и извлечения большой строки. Этот метод можно расценивать как мою личную оригинальность. В процессе написания деревьев я придумал кривую хитрость, но эффективность действительно неплохая. Я уже обсуждал эффективность метода join() ( http://blog.csdn.net/meizz/archive/2005/12/14/552260.aspx Скорость JavaScript: эффективность объединения и сращивания строк). Этот план оптимизации требует определенного уровня навыков работы с регулярными выражениями.
<input id="count" value="50000" size="7" maxlength="6">
<input type="button" value="Начальный размер массива" onclick="txt.innerHTML = array_init()"><br>
<input type="button" value="Традиционный цикл" onclick="txt.innerHTML += метод_for()">
<input type="button" value="Обычное соответствие" onclick="txt.innerHTML += метод_regexp()">
<div id="txt"></div>
<ЯЗЫК СКРИПТА="JavaScript">
var txt = document.getElementById("txt");
var a = новая
функция Array(
);
{
var n = parseInt(document.getElementById("count").value);
длина = 0;
for(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
вернуть "длина массива: "+ n;
}
функция метод_for()
{
вар n = a.length;
вар начало = новая дата().getTime();
вар б = новый массив ();
for(var i=0; i<n; i++)
{
if(a[i].indexOf("0,9999")==0)
{
б[b.длина] = а[я];
}
}
return ("<br>Традиционный метод цикла требует времени" + (new Date().getTime() - начало)
+" миллисекунды! Результаты получения: <strong title=""+ b.join(" ")
+"'>Получено записей "+ b.length +"!</strong>");
}
функция метод_regexp()
{
вар начало = новая дата().getTime();
вар б = новый массив ();
var s = a.join("x0f");
var r = new RegExp().compile("0\.9999\d+", "g");
б = s.match(r); s = "";
return ("<br>Обычный метод сопоставления требует времени" + (new Date().getTime() - начало)
+" миллисекунды! Результаты получения: <strong title=""+ b.join(" ")
+"'>Получено записей "+ b.length +"!</strong>");
}
</SCRIPT>
Вы можете протестировать его, чтобы увидеть, насколько велика разница в эффективности между двумя вышеуказанными методами! Код мертв, люди живы. Если вы измените свое мышление или модель, эффективность будет совсем другой.
Мне потребовалось немало мозгов, чтобы придумать этот трюк, и мне очень не хочется им делиться. Теперь я воспользуюсь им, чтобы поздравить всех с началом нового 2006 года.