首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >删除字符串中第一个字符的最快方法

删除字符串中第一个字符的最快方法
EN

Stack Overflow用户
提问于 2010-07-11 14:40:28
回答 5查看 352.7K关注 0票数 244

假设我们有以下字符串

代码语言:javascript
复制
string data= "/temp string";

如果我们想要删除第一个字符/,我们可以通过许多方法来实现,例如:

代码语言:javascript
复制
data.Remove(0,1);
data.TrimStart('/');
data.Substring(1);

但是,我真的不知道哪一个算法最好,而且做得更快。

有没有一个是最好的,还是所有的都一样?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-11 14:44:47

第二个选项实际上与其他选项不同-如果字符串是“/foo”,它将变成"foo“而不是"//foo”。

第一个选项比第三个选项需要更多的工作才能理解-我认为Substring选项是最常见和可读性最好的。

(显然,它们中的每一个作为单独的语句都不会做任何有用的事情-您需要将结果赋给一个变量,可能是data本身。)

我不会在这里考虑性能,除非它确实成为您的问题-在这种情况下,您知道的唯一方法就是拥有测试用例,然后很容易为每个选项运行这些测试用例并比较结果。我希望Substring在这里可能是最快的,因为Substring总是从原始输入的单个块创建字符串,而Remove至少必须潜在地将开始块和结束块粘合在一起。

票数 171
EN

Stack Overflow用户

发布于 2019-02-27 09:35:00

我知道这是一个超级优化的领域,但这似乎是踢BenchmarkDotNet车轮的好借口。这个测试的结果(甚至在.NET核心上)是SubstringRemove略快,在这个样本测试中:Remove的速度是19.37 is比22.52 is。因此速度提高了约16%。

代码语言:javascript
复制
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>();
        }
    }
}

结果:

代码语言:javascript
复制
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 |
票数 22
EN

Stack Overflow用户

发布于 2010-07-11 14:43:40

我猜RemoveSubstring会并列第一,因为它们都会吞噬字符串的固定大小部分,而TrimStart会从左侧扫描每个字符,然后必须执行与其他两种方法完全相同的工作。不过,说真的,这简直是吹毛求疵。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3222125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档