2012-02-03 4 views

ответ

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. Этот цикл работает ровно один раз, но накладные расходы все еще существуют.

+0

спасибо за вашу тестовую программу! – Laguna

+1

+1 Из интереса, кто-нибудь может перепроектировать перегрузки System.String.ReplaceInternal? Мне интересно узнать, не проявил ли Dev неизменность на перегрузке char :) – StuartLC

5

Я бы ожидал, чтоstring.Replace(char, char) потенциально будет быстрее, так как он может выделять точно необходимое количество пространства. Я сомневаюсь, что это существенно изменит производительность во многих приложениях реального мира.

Что еще более важно, я бы сказал, что это более читаемо - понятно, что на самом деле вы получите строку той же длины.

3

String.Replace(char, char) быстрее. Причина проста:

  • замена Чар не нужно выделить строку с другим размером, замена строки необходимо выяснить, новый размер первой или использовать StringBuilder для замены
  • замена Чар не делает необходимо выполнить проверку с рядом строк. Представьте, что у вас есть строка, например ABCACABCAC, и вы хотите заменить ABC. Вам нужно выяснить, соответствуют ли 3 символа, при работе с символами вам нужно только найти один символ.
Смежные вопросы