我一直在学习编程,选择C++和C#作为我的第一门语言。更具体地说,我借用了一本旧的C语言书籍来学习C#。我使用Visual Studio Express并编写C++和C#代码。一个吸引我的领域是能够进行直接内存管理。我试图学习使用它来优化我的代码。然而,我在正确使用它并实际看到任何真正的性能提升方面遇到了困难。例如,以下是C#中的代码:
unsafe static void Main(string[] args)
{
int size = 300000;
char[] numbers = new char[size];
for (int i = 0; i < size; i++)
{
numbers[i] = '7';
}
DateTime start = DateTime.Now;
fixed (char* c = &numbers[0])
{
for (int i = 0; i < 10000000; i++)
{
int number = myFunction(c, 100000);
}
}
/*char[] c = numbers; // commented out C# non-pointer version same
speed as C# pointer version
{
for (int i = 0; i < 10000000; i++)
{
int number = myFunction(c, 100000);
}
}*/
TimeSpan timeSpan = DateTime.Now - start;
Console.WriteLine(timeSpan.TotalMilliseconds.ToString());
Console.ReadLine();
}
static int myFunction(ref char[] numbers, int size)
{
return size * 100;
}
static int myFunction(char[] numbers, int size)
{
return size * 100;
}
unsafe static int myFunction(char* numbers, int size)
{
return size * 100;
}
无论我调用哪种方法,执行速度都是相同的。我还在努力理解使用ref和使用指针之间的区别,但这可能需要时间和实践。然而,我不明白的是,我能够在C++中产生非常显著的性能差异。当我尝试在C++中近似相同的代码时,我得到了以下结果:
/*int myFunction(std::string* numbers, int size) // C++ pointer version commented
out is much faster than C++ non-pointer version
{
return size * 100;
}*/
int myFunction(std::string numbers, int size) // value version
{
return size * 100;
}
int _tmain(int argc, _TCHAR* argv[])
{
int size = 100000;
std::string numbers = "";
for (int i = 0; i < size; i++)
{
numbers += "777";
}
clock_t start = clock();
for (int i = 0; i < 10000; i++)
{
int number = myFunction(numbers, 100000);
}
clock_t timeSpan = clock() - start;
std::cout << timeSpan;
char c;
std::cin >> c;
return 0;
}
有谁能告诉我为什么我的C#代码没有从我的引用或指针使用中受益呢?我一直在阅读网上的东西,但我卡住了。
/*
和*/
来注释它们之间的所有内容,而不是在每一行上使用//
。 - Prime