C# 计算大型.NET字符串中换行的最快方法是什么?
有没有办法改善这一点:C# 计算大型.NET字符串中换行的最快方法是什么?,c#,.net,C#,.net,有没有办法改善这一点: private static int CountNewlines(string s) { int len = s.Length; int c = 0; for (int i=0; i < len; i++) { if (s[i] == '\n') c++; } return c; } private static int CountNewlines(字符串s) { int len=s.长度; int
private static int CountNewlines(string s)
{
int len = s.Length;
int c = 0;
for (int i=0; i < len; i++)
{
if (s[i] == '\n') c++;
}
return c;
}
private static int CountNewlines(字符串s)
{
int len=s.长度;
int c=0;
对于(int i=0;i
我特别关心字符串上的项访问器。不确定它是否只是像C/C++那样的指针算法 这可能是最有效的选项-项访问器经过内部优化,您可以将其视为执行指针算术。您可以使用“tocharray();”将字符串转换为字符数组,但我认为这不会提高性能。。您可以尝试使用不安全的代码(指针)而不是for,但这也有它的缺点。我确信这不会比将字符串转换为字节并检查它们慢多少,如果不是更快的话。字符串类应该得到高度优化
如果这是一个大字符串,那么由多个线程执行的并行执行可能会使事情变得更快:-)如果在循环中使用它,则将其作为一个实例方法。好吧,
string
实现IEnumerable
,因此我一定会尝试:
s.Count( c => c == '\n' )
虽然看起来不错,但原始方法的速度快了30倍:)
我还没有放弃IEnumerable,所以我也尝试过:
int n = 0;
foreach( var c in s )
{
if ( c == '\n' ) n++;
}
return n;
这似乎和原来的方法一样快 我测试了这些实现
private static int Count1(string s)
{
int len = s.Length;
int c = 0;
for (int i=0; i < len; i++)
{
if (s[i] == '\n') c++;
}
return c+1;
}
private static int Count2(string s)
{
int count = -1;
int index = -1;
do
{
count++;
index = s.IndexOf('\n', index + 1);
}
while (index != -1);
return count+1;
}
private static int Count3(string s)
{
return s.Count( c => c == '\n' ) + 1;
}
private static int Count4(string s)
{
int n = 0;
foreach( var c in s )
{
if ( c == '\n' ) n++;
}
return n+1;
}
private static int Count5(string s)
{
var a = s.ToCharArray();
int c = 0;
for (int i=0; i < a.Length; i++)
{
if (a[i]=='\n') c++;
}
return c+1;
}
令人惊讶的是,对我来说,枚举器实现是最快的,比下一个最接近的实现快了20%。无论方法的运行顺序如何,结果都是可重复的。我还使用了预热阶段,以确保瞬态效应(jit等)被考虑在内
这是一个发布版本(/optimize+)字符串来自哪里?我想既然你对性能很关心,那它是一个大字符串?如果这个大字符串来自文件或Web服务调用,那么问题应该是“计算流中换行数的最快方法”。将整个内容转换为字符串的原因将是昂贵的。顺便说一句,这可能真的是愚人节,不能再说了:-)我担心性能,因为#1,它可能很大(32k),而#2,它正在Windows窗体控件的OnPaint()方法中使用。哈宁,为什么这会是愚人节呢?这似乎是一个很好的基础问题。@Cheeso:只有在字符串变量被修改的情况下,才有办法计算换行符的计数,也没有办法缓存该结果,而不是重新计算每个绘图的值?并行执行只会在多核/多处理器机器上加快速度,但它确实是一种选择大字符串。当然,创建的线程数不应该超过内核总数。如果此字符串包含许多换行符,它可能只是一个非常大的文本文件或其他内容,因此OP实际上可能会使用此选项…例如在使用systemIO时,调用file.Copy和new FileInfo。复制()。这是O'Reilly C#Cookbook写的没错,我可以做到。我还没试过。这是一个大字符串,它会被重复调用,所以我倾向于避免创建新的数组只是为了计算它。这会在同一个字符串上被多次调用吗?你可以有一个以a weakreference为键,以int为结果的口述。这样您就可以缓存结果。。
Time Factor
Count1 4.8581503 1.4
Count2 4.1406059 1.2
Count3 45.3614124 13.4
Count4 3.3896130 1.0
Count5 5.9304543 1.7