Что будет быстрее в этом контексте String.Format или String.Replace? - PullRequest
5 голосов
/ 30 сентября 2010
string str = 'my {0} long string {1} need formatting';

Должен ли я делать следующее,

str = string.Format(str, "really", "doesn't");

или создание такого метода и вызов str = str.ReplaceWithValues("really", "doesn't");

 public string ReplaceWithValues(this string str, params object[] values) {
    string ret = str;
    for (int i = 0; i < values.Length; i++) {
        ret = str.Replace(string.Concat("{", i, "}"), values.ToString());
    }
    return ret;
}

Похоже, что StringBuilder.AppendFormat () неэффективен, когда речь идет о таких простых заменах, поскольку он проходит символ за символом через строку.

Ответы [ 4 ]

15 голосов
/ 30 сентября 2010

Почему вы хотите заново изобрести String.Format?

Я бы просто использовал метод фреймворка - он делает именно то, что вы хотите, он надежен и будет иметь смысл для тех, кто следует ...


Просто для удовлетворенияВаше любопытство:

Похоже, что StringBuilder.AppendFormat () неэффективен, когда речь идет о таких простых заменах, поскольку он проходит символ за символом через строку.1011 * String.Format, FYI, использует StringBuilder.AppendFormat для внутреннего использования.При этом StringBuilder.AppendFormat достаточно эффективен.Вы упоминаете, что он проходит «символ за символом» через строку - однако, в вашем случае, вместо этого вы используете несколько вызовов Replace и Concat.Один проход через строку с помощью StringBuilder, вероятно, будет намного быстрее.Если вам действительно нужно знать, вы можете проверить это.На моем компьютере я получаю следующие тайминги, если я запускаю оба вышеуказанных 1000000 раз:

String.Format -  1029464 ticks
Custom method -  2988568 ticks
2 голосов
/ 30 сентября 2010

Пользовательская процедура будет увеличивать свою стоимость с каждым дополнительным заполнителем и генерировать одноразовые строки для сборщика мусора при каждом промежуточном вызове Replace.

Кроме вероятности, что string.Format намного быстрее, чем множественные вызовыдо Replace, string.Format также включает перегрузки для операций, чувствительных к культуре.

Гибкость и интуитивность string.Format по меньшей мере столь же неотразимы, как и скорость.

1 голос
/ 30 сентября 2010

Если все, что вам нужно, это объединить некоторые строки, почему бы просто не сделать это?

string result = "my " + x + " long string " + y + " need formatting";

или

string result = string.Concat("my ", x, " long string ", y, " need formatting");
0 голосов
/ 30 сентября 2010

В C # оператор + фактически превращается в строку. Concat (), и я всегда думал, что String.Format("Hello: {0} {1}", "Bob", "Jones") был самым быстрым.Оказывается, после запуска образца, запущенного вне отладчика, в режиме выпуска, "Bob" + "Jones" намного быстрее.Хотя есть точка отсечения.Я считаю, что около 8 конкатенаций или около того, строка. Формат становится быстрее.

...