Быстрее ли использовать arraylist символов для выполнения конкатенации нескольких строк?
-
20-09-2019 - |
Вопрос
Я использую .Net micro framework, поэтому StringBuilder недоступен.
Я видел некоторый код от профессионалов apt, позволяющий использовать Arraylist символов для объединения и построения строк, в отличие от оператора +.По сути, они создают StringBuilder с управляемым кодом.
Есть ли в этом преимущество в производительности?Предположим, что количество конкатенаций больше 10, а длина строки также больше 10.
Решение
Нет, не используйте ArrayList
из char
ценности.Это ограничит каждый символ - производительность будет ужасной, как и использование памяти.(Размер ссылки + размер символа в штучной упаковке для каждого символа...фу!)
Используйте char[]
внутренне и "изменяйте размер" его (создайте новый массив и скопируйте в него содержимое), когда вам нужно, возможно, удваивая размер каждый раз.(РЕДАКТИРОВАТЬ:Вы не изменяете его размер до нужного вам размера - вы бы начали, скажем, с 16 символов и продолжали удваивать - поэтому большинство Append
операции не надо нужно "изменить размер" массива.)
Это похоже на то, как StringBuilder
работает в любом случае.(Это даже ближе к тому, как Java StringBuilder
работает.)
Я предлагаю вам на самом деле создать свой собственный StringBuilder
введите с наиболее важными элементами.Модульное тестирование до чертиков похоже на это, и профилирование там, где это уместно.
Дайте мне знать, если вам нужен короткий пример.
Другие советы
Единственная причина, по которой использование ArrayList символов для построения строки будет считаться производительным, - это если вы сравните его с чем-то, что имеет действительно плохую производительность.Объединение огромной строки с использованием += было бы примером чего-то, что имело бы такую плохую производительность.
Вы можете сделать конкатенацию строк намного более эффективной, если просто объедините их в несколько более коротких строк вместо одной большой строки.
Этот код, например:
string[] parts = new string[1000];
for (int i = 0; i < parts.Length; i++) {
string part = String.Empty;
for (int j=0; j < 100; j++) {
part += "*";
}
parts[i] = part;
}
string result = String.Concat(parts);
Примерно в 450 раз быстрее, чем этот код:
string result = string.Empty;
for (int i = 0; i < 100000; i++) {
result += "*";
}
StringBuilder по-прежнему работает быстрее, но это всего примерно в четыре раза быстрее, чем в первом примере.Таким образом, используя более короткие строки, вы можете сократить время на 99,78%, а использование StringBuilder сократит еще только на 0,16%.