当前位置:  开发笔记 > 编程语言 > 正文

更有效的方法来确定字符串是否以一组令牌中的令牌开头?

如何解决《更有效的方法来确定字符串是否以一组令牌中的令牌开头?》经验,为你挑选了2个好方法。

我现在正在做一些我现在正在做的代码:

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#中是否有更有效的方法.这段代码需要每秒执行很多次,而且我对完成所有这些字符串比较所花费的时间不太满意.有什么建议?:)



1> Markus Olsso..:

一种优化方法是使用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 ms
culture sensitive ran 1000000 times in 175.5859 ms

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

Theese优化是一种简单的方法,可以使您当前的实现更好,但如果性能真的很关键(我的意思是非常关键),那么您应该考虑实现某种状态机.



2> Mike Houston..:

在概念上与Vojislav的FSM答案类似,你可以尝试将常数放入trie中.然后,您可以使用trie的单次遍历替换您的比较序列.

这里描述了一个C#trie实现.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有