C# 为什么这个代码在C++中搜索子串比C慢很多?

C# 为什么这个代码在C++中搜索子串比C慢很多?,c#,c++,C#,C++,我有两个不同的.txt文件,其中包含1.000.000位数的pi和前200个斐波那契数 这里是pi1000000--> 这里是fibonacci200--> 我的目的是在pi中逐个搜索所有斐波那契数 我用两种编程语言编写:C++和C.< 它们之间存在巨大的执行时间差异。我不知道原因 对于相同的过程,C在4秒内完成,C++在80s内完成它。 为什么它们之间有巨大的执行时间差异 这是我在大字符串中搜索小字符串的算法 c代码 public static void search(string t

我有两个不同的.txt文件,其中包含1.000.000位数的pi和前200个斐波那契数

这里是pi1000000-->

这里是fibonacci200-->

我的目的是在pi中逐个搜索所有斐波那契数

我用两种编程语言编写:C++和C.< 它们之间存在巨大的执行时间差异。我不知道原因

对于相同的过程,C在4秒内完成,C++在80s内完成它。 为什么它们之间有巨大的执行时间差异

这是我在大字符串中搜索小字符串的算法

c代码

    public static void search(string text, string pattern)
    {
        for (int i = 0; i <= text.Length - pattern.Length; i++)
        {
            int j = 0;
            while (j < pattern.Length)
            {
                if (text[i + j] != pattern[j]) break;
                j++;
            }

            if (j == pattern.Length)
            {
                //Console.WriteLine("Pattern is found at index: " + i.ToString() + " and the value is: " + pattern.ToString());
            }
        }
    }

    public static void Main()
    {
        string pi = File.ReadAllText("pi1000000.txt", Encoding.ASCII);
        string[] fibo = File.ReadAllLines("fibonacci200.txt", Encoding.ASCII);

        Stopwatch stopwatch = new Stopwatch();

        stopwatch.Start();

        for (int i = 0; i < 200; i++)
        {
            search(pi, fibo[i]);
        }

        stopwatch.Stop();
        Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);

    }
c++代码

#include <iostream>
#include <string>
#include <fstream>
#include <ctime>

using namespace std;

void search(string text, string pattern)
{
int t_l = text.length();
int p_l = pattern.length();
int difference = t_l - p_l;

for (int i = 0; i <= difference; i++)
{
    int j = 0;
    for (j; j < p_l; j++)
    {
        if (text[i + j] != pattern[j]) break;
    }
    if (j == p_l)
    {
        //cout << i << endl;
    }   
}
}

int main()
{
ifstream infile1;
string pi;
infile1.open("pi1000000.txt");
infile1 >> pi;
infile1.close();

short int i = 0;
string fibo[200];
string a;
ifstream infile2;
infile2.open("fibonacci200.txt");
while (getline(infile2, a))
{
        fibo[i] += a;
        i++;
}
infile2.close();

clock_t begin = clock();

for (int i = 0; i < 2; i++)
{
    search(pi, fibo[i]);
}

clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;

cout << elapsed_secs << endl; 

string x;
cin >> x;

return 0;
}

在C++代码中,你把PI的所有1.0万个数字加在字符串PI上,然后你按价值通过那个巨大的字符串来搜索200次,这是至少200个相同的大字符串的副本,内存分配和删除都很大。 而是将其作为引用传递:

void search(const string& text, const string& pattern)
然后检查代码片段的运行情况

即使您在C中也这样做,这也不是问题,因为由于C的工作方式,您已经在传递对实际字符串的引用


我刚刚用新的引用测试了代码,并尝试在MSVC上发布和调试x64,发布优化了整个循环,因为它没有用,所以甚至不可测试,调试完成1秒。

< P> C++代码编译成定时编译的机器指令,C代码编译成C++语言运行时CLR,微软的.NETFramework提供了良好的内存管理和线程管理。另外,你只给了我们C代码,所以很难说为什么C++代码会慢一些。一个好的开始是不要复制字符串200次。请提供完整的代码。为什么要删除include?如果通过引用传递字符串,这会改变什么吗?臭名昭著的第5部分。链接被破坏以保护有罪:但如何配置该代码并找出如何使其更好的良好提示。C++代码效率低下,因为它对字符串进行了深度复制,而不是通过引用传递,这是C代码已经做的。您的答案不能解释为什么在这种情况下,C++代码比C慢20X,它只是提供编译代码与JIT代码不同的背景信息。