Есть ли разница в производительности между String.Replace (char, char) и String.Replace (строка, строка), когда мне просто нужно заменить один символ другим?String.Replace (char, char) или Replace (строка, строка)?
9
A
ответ
9
Да, есть: я провел быстрый эксперимент, и похоже, что строковая версия примерно в 3 раза медленнее.
string a = "quickbrownfoxjumpsoverthelazydog";
DateTime t1 = DateTime.Now;
for (int i = 0; i != 10000000; i++) {
var b = a.Replace('o', 'b');
if (b.Length == 0) {
break;
}
}
DateTime t2 = DateTime.Now;
for (int i = 0; i != 10000000; i++) {
var b = a.Replace("o", "b");
if (b.Length == 0) {
break;
}
}
DateTime te = DateTime.Now;
Console.WriteLine("{0} {1}", t2-t1, te-t2);
1.466s против 4.583s
Это не удивительно, так как перегрузка со строками требуется дополнительный цикл, чтобы пройти через все символы в oldString
. Этот цикл работает ровно один раз, но накладные расходы все еще существуют.
5
Я бы ожидал, чтоstring.Replace(char, char)
потенциально будет быстрее, так как он может выделять точно необходимое количество пространства. Я сомневаюсь, что это существенно изменит производительность во многих приложениях реального мира.
Что еще более важно, я бы сказал, что это более читаемо - понятно, что на самом деле вы получите строку той же длины.
3
String.Replace(char, char)
быстрее. Причина проста:
- замена Чар не нужно выделить строку с другим размером, замена строки необходимо выяснить, новый размер первой или использовать
StringBuilder
для замены - замена Чар не делает необходимо выполнить проверку с рядом строк. Представьте, что у вас есть строка, например
ABCACABCAC
, и вы хотите заменитьABC
. Вам нужно выяснить, соответствуют ли 3 символа, при работе с символами вам нужно только найти один символ.
Смежные вопросы
- 1. Char * против станда :: строка
- 2. Преобразование «unsigned char *» в «char *» (и строка)
- 3. строка в список char
- 4. Java replace ascii char
- 5. Метод String.Replace (char, char) в C#
- 6. char + Строка, дающая странный результат
- 7. Использование строки + строка + строка против использования string.replace
- 8. Понятие char array [] и строка
- 9. Почему строка поддерживает `operator = (char)`?
- 10. Оператор присваивания для Char Строка
- 11. Строка сравнить с использованием char
- 12. scanf строка в указателе char
- 13. преобразование char ** в char * или char
- 14. scanf ("% d", char *) - строка формата char-as-int?
- 15. Java - StringBuilder replace() показывает ошибку: метод String.replace (char, char) не применимо
- 16. добавление char [] в char ** (строка в список строк)
- 17. используя .replace (char oldChar, char newChar) в java
- 18. Строка в Char Array не работает
- 19. Строка сканирования ввода с char и num
- 20. Boost.spirit: парсинг номер char и строка
- 21. string.replace (или другая строка модификации) не работает
- 22. Строка после добавления Char, изменяющая ее размер
- 23. PHP Специальный char \ t обрабатывается как строка
- 24. Как строка отличается от массива Char?
- 25. Java single char Строка, представленная несколькими байтами
- 26. Последнее, но одно Char в vb.net Строка
- 27. Строка (const char *, size_t) в int?
- 28. strtok_s сбой программы, когда строка имеет char *
- 29. Является ли строка строки указателем char?
- 30. Создание зЬй :: строка из Char * в C++
спасибо за вашу тестовую программу! – Laguna
+1 Из интереса, кто-нибудь может перепроектировать перегрузки System.String.ReplaceInternal? Мне интересно узнать, не проявил ли Dev неизменность на перегрузке char :) – StuartLC