C# 为什么这个代码在C++中搜索子串比C慢很多?
我有两个不同的.txt文件,其中包含1.000.000位数的pi和前200个斐波那契数 这里是pi1000000--> 这里是fibonacci200--> 我的目的是在pi中逐个搜索所有斐波那契数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
我用两种编程语言编写: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代码不同的背景信息。