Быстрее ли использовать arraylist символов для выполнения конкатенации нескольких строк?

StackOverflow https://stackoverflow.com/questions/1750811

  •  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%.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top