gpt4 book ai didi

c# - 确定字符串是否以一组标记中的标记开头的更有效方法?

转载 作者:太空狗 更新时间:2023-10-29 22:03:17 25 4
gpt4 key购买 nike

我目前在我正在处理的一些代码中正在做这样的事情:

public CommandType GetCommandTypeFromCommandString(String command)
{
if(command.StartsWith(CommandConstants.Acknowledge))
return CommandType.Acknowledge;
else if (command.StartsWith(CommandConstants.Status))
return CommandType.Status;
else if (command.StartsWith(CommandConstants.Echo))
return CommandType.Echo;
else if (command.StartsWith(CommandConstants.Warning))
return CommandType.Warning;
// and so on

return CommandType.None;
}

我想知道在 C# 中是否有更有效的方法来执行此操作。这段代码每秒需要执行很多很多次,我对执行所有这些字符串比较所花费的时间不太满意。有什么建议么? :)

最佳答案

一种优化方法是使用 StringComparison 枚举来指定您只需要进行序数比较。像这样:

if(command.StartsWith(CommandConstants.Acknowledge, StringComparison.Ordinal))
return CommandType.Acknowledge;

如果您不指定字符串比较方法,将使用当前区域性进行比较,这会减慢速度。

我做了一些(真的很天真)基准测试:

var a = "foo bar foo";
var b = "foo";

int numTimes = 1000000;

Benchmark.Time(() => a.StartsWith(b, StringComparison.Ordinal), "ordinal", numTimes);
Benchmark.Time(() => a.StartsWith(b), "culture sensitive", numTimes);

产生了以下结果:

ordinal ran 1000000 times in 35.6033 msculture sensitive ran 1000000 times in 175.5859 ms

您还应该对比较进行排序,以便首先比较最有可能的标记(快乐路径)。

这些优化是使您当前的实现性能更好的简单方法,但如果性能真的很关键(我的意思是真的很关键),您应该考虑实现某种状态机。

关于c# - 确定字符串是否以一组标记中的标记开头的更有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/484796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com