我一直在学习编程,并选择 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# 代码没有从我使用引用或指针中受益?我一直在网上阅读东西等等,但我被困住了。