Использование split() работает медленно по сравнению с некоторыми другими методами, особенно если строка достаточно большая.
Приведенные ниже тесты выполнены на моем компьютере для цели Neko, скомпилированной с помощью Haxe 2.10. Давайте сначала проверим строку из 6 символов ("abcdef").
Реализация A с разделением/объединением занимает около (0,030 мс):
var s = "abcdef";
var a = s.split('');
a.reverse();
s = a.join('');
// s contains "fedcba"
Реализация B работает примерно так же медленно, если не медленнее, чем решение A (0,032 мс):
var s = "abcdef";
var s2 = "";
for (i in -s.length+1...1)
s2 += s.charAt(-i);
// s2 contains "fedcba"
Реализация C в 5 раз быстрее, чем реализация A (0,006 мс):
import StringBuf;
using StringTools;
var s = "abcdef";
var s2 = new StringBuf();
for (i in -s.length+1...1)
s2.add(s.charAt(-i));
// s2.toString() contains "fedcba"
Реализация D кажется самой быстрой, примерно в 16 раз быстрее, чем реализация A (0,002 мс):
import StringBuf;
using StringTools;
var s = "abcdef";
var s2 = new StringBuf();
for (i in -s.length+1...1)
s2.addChar(s.fastCodeAt(-i));
// s2.toString() contains "fedcba"
// if introducing var s3 = s2.toString() it then takes from 0.003 to 0.004ms total
// so this still seems the fastest on Neko.
Сводка измерений Neko с помощью строки из 6 символов (рассчитана на основе 500 000 итераций и разделена соответствующим образом):
- A: 0.030ms
- B: 0,032 мс (худшее)
- C: 0,006 мс (в 5 раз быстрее, чем A)
- D: 0,002 мс (лучшее, в 16 раз быстрее, чем A)
Измерения строки из 250 символов (рассчитаны на основе 500 000 итераций и разделены соответствующим образом):
- A: 0.996ms
- B: 1,326 мс (все еще худшее)
- C: 0,166 мс (в 6 раз быстрее, чем A)
- D: 0,044 мс (лучшее, в 22 раза быстрее, чем A)
Результаты показывают, что реализация A становится все медленнее и медленнее по сравнению с D по мере роста размера строки (это означает, что ее функция сложности O (n) хуже).
По этим причинам я рекомендую реализация D.
person
the_yellow_logo
schedule
20.08.2014