Скажем, у нас есть следующая строка
string data= "/temp string";
Если мы хотим удалить первый символ, /
мы можем сделать это несколькими способами:
data.Remove(0,1);
data.TrimStart('/');
data.Substring(1);
Но, на самом деле, я не знаю, какой из них имеет лучший алгоритм и делает это быстрее ...
Есть один, который лучше или все одинаковы?
/
?TrimStart
не удалит первый символ, он удалитn
символы с самого начала.Substring
самый быстрыйTrimStart()
это полностью исключено.Ответы:
Второй вариант на самом деле не такой, как другие - если строка "/// foo", она станет "foo" вместо "// foo".
Для первого варианта требуется немного больше работы, чем для третьего - я бы посчитал этот
Substring
вариант наиболее распространенным и читаемым.(Очевидно, что каждый из них как отдельный оператор не будет делать ничего полезного - вам нужно будет присвоить результат переменной, возможно,
data
самому себе.)Я бы не стал принимать во внимание производительность, если только это на самом деле не стало для вас проблемой - в этом случае единственный способ, которым вы знали бы, это иметь тестовые случаи, а затем легко запустить эти тестовые примеры для каждого варианта и сравнить результаты. Я бы,
Substring
вероятно, предположил, что он будет самым быстрым здесь, просто потому, чтоSubstring
всегда заканчивает тем, что создает строку из одного фрагмента исходного ввода, тогда какRemove
должен, по крайней мере, потенциально склеить начальный блок и конечный блок.источник
Я знаю, что это гипероптимизация, но мне показалось, что это хороший повод, чтобы пнуть колеса
BenchmarkDotNet
. Результат этого теста (даже на .NET Core)Substring
немного быстрее, чемRemove
в этом тесте: 19,37 нс против 22,52 нс дляRemove
. Так что на ~ 16% быстрее.Полученные результаты:
источник
Я полагаю, что это
Remove
иSubstring
связало бы первое место, так как они оба выплескивают часть строки фиксированного размера, тогда какTrimStart
выполняет сканирование слева с проверкой каждого символа, а затем должно выполнить точно такую же работу, что и два других метода. Серьезно, однако, это расщепление волосков.источник
Substring
быстрее, чемRemove
, потому чтоRemove
звонкиSubstring
.Substring
и другоеRemove
полагается на частный методFillSubstring
.string Remove(this string source, int from, int to) { return source.SubString(0, from) + source.SubString(to); }
System.PInvoke.EE.AllocateString
выделение целевого строкового объекта, а затем вызываютFillSubstring
копирование символов. Я смотрю не на ту вещь?Substring
>Remove
). Я не буду комментировать дальше, потому что обсуждение заняло достаточно времени.Вы могли бы профилировать это, если вы действительно заботились. Напишите цикл из множества итераций и посмотрите, что произойдет. Однако есть вероятность, что это не является узким местом в вашем приложении, и TrimStart кажется наиболее семантически правильным. Стремитесь писать код читабельно, прежде чем оптимизировать.
источник
TrimStart
наименее правильно, так"//temp string".TrimStart('/')
как не просто удалит первый'/'
.