문자열에서 첫 번째 문자를 제거하는 가장 빠른 방법
다음과 같은 문자열이 있다고 가정합니다.
string data= "/temp string";
첫 번째 문자를 제거하려면/
다음과 같은 다양한 방법으로 할 수 있습니다.
data.Remove(0,1);
data.TrimStart('/');
data.Substring(1);
근데 정말 어떤 알고리즘이 가장 좋은지 몰라서 더 빨리 할 수 있어요.
가장 좋은 것이 있나요 아니면 모두 같은 것이 있나요?
두 번째 옵션은 실제로 다른 옵션과 다릅니다. 문자열이 "//foo"이면 "//foo"가 아닌 "foo"가 됩니다.
첫 번째 옵션은 세 번째 옵션보다 조금 더 많은 작업이 필요합니다.Substring
가장 일반적이고 읽기 쉬운 옵션입니다.
(분명히 각각의 문장은 유용하지 않습니다.변수에 결과를 할당해야 합니다.data
그 자체)
실제로 문제가 되지 않는 한 퍼포먼스는 고려하지 않습니다.이 경우 테스트 케이스를 가지고 각 옵션에 대해 테스트 케이스를 실행해 결과를 비교하는 것만이 유일한 방법입니다.기대하겠습니다Substring
아마 여기서 제일 빠를 거예요.단순히 이유는Substring
는 항상 원래 입력의 단일 청크에서 문자열을 작성합니다.Remove
적어도 시작 청크와 끝 청크를 접착해야 합니다.
여기가 초최적화 지역인 건 알지만, 이 지역을 벗어나기 위한 좋은 핑계처럼 보였어요.BenchmarkDotNet
. 이 테스트의 결과(에서).NET Core(짝수)는 다음과 같습니다.Substring
보다 약간 빠르다Remove
, 이 테스트 예에서는, 19.37 ns 와 22.52 ns 를 비교하고 있습니다.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 |
그런 것 같아요Remove
그리고.Substring
둘 다 스트링의 일정한 사이즈의 부분을 후루룩 들이마셨기 때문에 공동 1위를 할 것입니다.TrimStart
는 왼쪽에서 스캔하여 각 문자를 테스트한 후 다른 두 가지 방법과 동일한 작업을 수행해야 합니다.정말이지, 이건 머리카락이 갈라지는 거야.
.Net Core 에서는, 다음과 같이 동작합니다.
data = data[1..];
정말 신경 쓴다면 프로파일링도 할 수 있어여러 번 반복한 루프를 작성하여 어떤 일이 일어나는지 확인합니다.그러나 이것이 어플리케이션의 병목현상이 아닐 가능성이 높으며 Trim Start가 가장 의미적으로 맞는 것 같습니다.최적화하기 전에 코드를 읽기 쉽게 쓰십시오.
언급URL : https://stackoverflow.com/questions/3222125/fastest-way-to-remove-first-char-in-a-string
'programing' 카테고리의 다른 글
Excel 2007 패스스루 Windows 인증 (0) | 2023.04.19 |
---|---|
StackPanel 주위에 경계를 설정합니다. (0) | 2023.04.19 |
applicationWillEnterForeground vs. applicationDidBecomeActive, applicationWillResignActive vs.applicationDidEnterBackground (0) | 2023.04.19 |
채워진 행을 통해 반복 (0) | 2023.04.19 |
보기가 표시되기 전에 iPhone에서 UITableView의 맨 아래까지 스크롤하는 방법 (0) | 2023.04.14 |