Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C语言中快速获取字符串中字符的出现次数?_C#_.net - Fatal编程技术网

C# 如何在C语言中快速获取字符串中字符的出现次数?

C# 如何在C语言中快速获取字符串中字符的出现次数?,c#,.net,C#,.net,我有一个txt文件。现在,我需要逐行加载它,并检查“@”在整个文件中出现了多少次 所以,基本上,我有一个单行字符串,如何得到快速发生的次数 我需要快速计算,因为我们有很多这样的文件,每个文件大约有300-400MB 我搜索了一下,似乎直截了当的方法是最快的方法: int num = 0; foreach (char c in line) { if (c == '@') num++; } 有没有比这更快的方法?还有其他建议吗 如果需要,我们不必逐行加载txt文件,但我们需要知道每个文件

我有一个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
这是出乎意料的。在这个版本中,我们以500k个字符的块读取文件,而不是将其完全加载到内存中,执行时间甚至比以前的方法更低。请注意,减小块大小将增加执行时间(因为开销)。内存消耗极低(正如预期的那样,我们只将大约500kB/1MB的内存直接加载到一个字符数组中)

通过改变块大小可以获得更好(或更差)的性能

选项3:分块读取文件,并行化
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
正如预期的那样,这个版本的性能比单线程版本要好,但不是我们想象的4倍。与第一个版本相比,内存消耗再次非常低(与以前相同的考虑事项),我们正在利用多核环境

块大小和并行任务数等参数可能会显著改变结果,您应该通过反复试验来找到最适合您的组合

结论 我倾向于认为“加载内存中的所有内容”版本是最快的,但这实际上取决于字符串处理的开销和I/O速度。并行分块方法在我的机器中似乎是最快的,这应该会让你想到一个主意:当有疑问时,就对它进行基准测试。

最快的方法实际上与I/O能力和计算速度有关。通常,了解什么是最快技术的最好方法是对它们进行基准测试

免责声明:结果(当然)绑定到我的机器,在不同的硬件上可能会有很大差异。为了进行测试,我使用了一个大约400MB大小的文本文件。如果感兴趣,可以下载(压缩)该文件。编译为x86的可执行文件

选项1:读取整个文件,无并行化 结果:

  • 平均执行时间:
    4819ms
  • 平均进程内存:
    7.48MB
这是出乎意料的。在这个版本中,我们以500k个字符的块读取文件,而不是将其完全加载到内存中,执行时间甚至比以前的方法更低。请注意,减小块大小将增加执行时间(因为开销)。内存消耗极低(正如预期的那样,我们只将大约500kB/1MB的内存直接加载到一个字符数组中)

通过改变块大小可以获得更好(或更差)的性能

选项3:分块读取文件,并行化
long count=0;
使用(var file=file.OpenRead(“C:\\tmp\\test.txt”))
使用(变量读取器=新压力