【发布时间】:2014-06-26 18:04:23
【问题描述】:
我一直在学习编程,我选择了 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# 代码没有从我使用引用或指针中受益?我一直在网上看东西等等,但我被卡住了。
【问题讨论】:
-
只是小费;使用
/*和*/来注释它们之间的所有内容,而不必在每一行都使用//。 -
在实际的 C# 中,您可能永远不必使用不安全的代码,除了某些平台互操作情况和可能的图像操作。 C# 并非旨在直接用于管理内存,因此提供了开箱即用的垃圾收集等功能。因此,在大多数情况下,它的性能不会受益于直接内存操作。仅仅是因为它不会编译为机器代码,并且仍然在 CLR 之上执行。另一方面,C++ 直接编译为机器码并几乎完全按原样执行您的代码,因此内存优化起作用。
-
C# 对象默认是通过引用传递的,所以即使它看起来是通过使用昂贵的大副本按值传递的,它不是并且只是引用,并且仅在必要时复制对象(修改)
-
我认为在一个非常紧凑的循环中进行简单乘法的 100000 次迭代甚至不足以在执行时间方面注册任何内容。你甚至没有对数组/指针做任何事情,那么你到底在计时什么?
-
不要使用 C 书来学习 C#——这只会让人感到困惑。这些语言的语法有些相似,但有很多不同。
标签: c# c++ c performance pointers