Самый быстрый способ удалить первый символ в строке - PullRequest
178 голосов
/ 11 июля 2010

Скажем, у нас есть следующая строка

string data= "/temp string";

Если мы хотим удалить первый символ /, мы можем сделать это многими способами, например:

data.Remove(0,1);
data.TrimStart('/');
data.Substring(1);

Но, действительно, я не знаю, какой из них имеет лучший алгоритм и делает это быстрее ..
Есть кто-то, кто лучший или все одинаковые?

Ответы [ 4 ]

130 голосов
/ 11 июля 2010

Второй вариант на самом деле не такой, как другие - если строка "/// foo", она станет "foo" вместо "//foo".

Для первого варианта требуется немного больше работы, чем для третьего - я бы назвал вариант Substring наиболее распространенным и читаемым.

(Очевидно, что каждый из них как отдельный оператор не будет делать ничего полезного - вам нужно будет присвоить результат переменной, возможно, data.)

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

8 голосов
/ 11 июля 2010

Я бы предположил, что Remove и Substring будут привязаны к первому месту, так как они оба отрывают часть строки фиксированного размера, тогда как TrimStart выполняет сканирование слева с проверкой на каждомперсонаж, а затем должен выполнить точно такую ​​же работу, что и два других метода.Серьезно, однако, это расщепление волосков.

6 голосов
/ 11 июля 2010

Вы можете профилировать это, если вам действительно интересно.Напишите цикл из множества итераций и посмотрите, что произойдет.Однако есть вероятность, что это не является узким местом в вашем приложении, и TrimStart кажется наиболее семантически правильным.Стремитесь писать код читабельно, прежде чем оптимизировать.

3 голосов
/ 27 февраля 2019

Я знаю, что это гипероптимизация, но это казалось хорошим поводом, чтобы пнуть колеса BenchmarkDotNet.Результат этого теста (даже на .NET Core) таков, что Substring немного быстрее, чем Remove, в этом тесте: 19,37 нс против 22,52 нс для Remove.Так что на ~ 16% быстрее.

using System;
using BenchmarkDotNet.Attributes;

namespace BenchmarkFun
{
    public class StringSubstringVsRemove
    {
        public readonly string SampleString = " My name is Daffy Duck.";

        [Benchmark]
        public string StringSubstring() => SampleString.Substring(1);

        [Benchmark]
        public string StringRemove() => SampleString.Remove(0, 1);

        public void AssertTestIsValid()
        {
            string subsRes = StringSubstring();
            string remvRes = StringRemove();

            if (subsRes == null
                || subsRes.Length != SampleString.Length - 1
                || subsRes != remvRes) {
                throw new Exception("INVALID TEST!");
            }
        }
    }

    class Program
    {
        static void Main()
        {
            // let's make sure test results are really equal / valid
            new StringSubstringVsRemove().AssertTestIsValid();

            var summary = BenchmarkRunner.Run<StringSubstringVsRemove>();
        }
    }
}

Результаты:

BenchmarkDotNet=v0.11.4, OS=Windows 10.0.17763.253 (1809/October2018Update/Redstone5)
Intel Core i7-6700HQ CPU 2.60GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100-preview-010184
  [Host]     : .NET Core 3.0.0-preview-27324-5 (CoreCLR 4.6.27322.0, CoreFX 4.7.19.7311), 64bit RyuJIT
  DefaultJob : .NET Core 3.0.0-preview-27324-5 (CoreCLR 4.6.27322.0, CoreFX 4.7.19.7311), 64bit RyuJIT

|          Method |     Mean |     Error |    StdDev |
|---------------- |---------:|----------:|----------:|
| StringSubstring | 19.37 ns | 0.3940 ns | 0.3493 ns |
|    StringRemove | 22.52 ns | 0.4062 ns | 0.3601 ns |
...