C# 如何在C语言中快速获取字符串中字符的出现次数?
我有一个txt文件。现在,我需要逐行加载它,并检查“@”在整个文件中出现了多少次 所以,基本上,我有一个单行字符串,如何得到快速发生的次数C# 如何在C语言中快速获取字符串中字符的出现次数?,c#,.net,C#,.net,我有一个txt文件。现在,我需要逐行加载它,并检查“@”在整个文件中出现了多少次 所以,基本上,我有一个单行字符串,如何得到快速发生的次数 我需要快速计算,因为我们有很多这样的文件,每个文件大约有300-400MB 我搜索了一下,似乎直截了当的方法是最快的方法: int num = 0; foreach (char c in line) { if (c == '@') num++; } 有没有比这更快的方法?还有其他建议吗 如果需要,我们不必逐行加载txt文件,但我们需要知道每个文件
我需要快速计算,因为我们有很多这样的文件,每个文件大约有300-400MB 我搜索了一下,似乎直截了当的方法是最快的方法:
int num = 0;
foreach (char c in line)
{
if (c == '@') num++;
}
有没有比这更快的方法?还有其他建议吗
- 如果需要,我们不必逐行加载txt文件,但我们需要知道每个文件中的#行
谢谢您可以测试它是否更快,但编写它的较短方法是:
int num = File.ReadAllText(filePath).Count(i => i == '@');
嗯,但我刚才看到你也需要行数,所以这是相似的。同样,需要与您拥有的进行比较:
var fileLines = File.ReadAllLines(filePath);
var count = fileLines.Length();
var num = fileLines.Sum(line => line.Count(i => i == '@'));
您可以测试它是否更快,但编写它的较短方法是:
int num = File.ReadAllText(filePath).Count(i => i == '@');
嗯,但我刚才看到你也需要行数,所以这是相似的。同样,需要与您拥有的进行比较:
var fileLines = File.ReadAllLines(filePath);
var count = fileLines.Length();
var num = fileLines.Sum(line => line.Count(i => i == '@'));
你可以用指针。我不知道这是否会更快。您必须进行一些测试:
static void Main(string[] args)
{
string str = "This is @ my st@ing";
int numberOfCharacters = 0;
unsafe
{
fixed (char *p = str)
{
char *ptr = p;
while (*ptr != '\0')
{
if (*ptr == '@')
numberOfCharacters++;
ptr++;
}
}
}
Console.WriteLine(numberOfCharacters);
}
请注意,您必须进入项目属性并允许使用不安全的代码才能使此代码正常工作。您可以使用指针。我不知道这是否会更快。您必须进行一些测试:
static void Main(string[] args)
{
string str = "This is @ my st@ing";
int numberOfCharacters = 0;
unsafe
{
fixed (char *p = str)
{
char *ptr = p;
while (*ptr != '\0')
{
if (*ptr == '@')
numberOfCharacters++;
ptr++;
}
}
}
Console.WriteLine(numberOfCharacters);
}
请注意,您必须进入项目属性并允许使用不安全的代码才能使此代码正常工作。最快的方法实际上与I/O功能和计算速度有关。通常,了解什么是最快技术的最好方法是对它们进行基准测试
免责声明:结果(当然)绑定到我的机器,在不同的硬件上可能会有很大差异。为了进行测试,我使用了一个大约400MB大小的文本文件。如果感兴趣,可以下载(压缩)该文件。编译为x86的可执行文件
选项1:读取整个文件,无并行化
结果:
- 平均执行时间:
4819ms
- 平均进程内存:
7.48MB
long count=0;
使用(var file=file.OpenRead(“C:\\tmp\\test.txt”))
使用(var reader=newstreamreader(文件))
{
const int size=2000000;//这大约是单线程值的4倍
const int parallelization=4;//这将在并行处理的子块中分割块
char[]buffer=新字符[大小];
而(!reader.EndOfStream)
{
var read=await reader.ReadBlockAsync(缓冲区,0,大小);
var sliceSize=读取/并行化;
var计数=新长[并行化];
对于(0,并行化,i=>{
var start=i*切片大小;
var end=开始+切片大小;
if(i==并行化)
end+=读取%并行化;
长localCount=0;
对于(var j=start;j
结果:
- 平均执行时间:
3363 ms
- 平均进程内存:
10.37 MB
- 平均执行时间:
4819ms
- 平均进程内存:
7.48MB
long count=0;
使用(var file=file.OpenRead(“C:\\tmp\\test.txt”))
使用(变量读取器=新压力