在我的计算机中,此代码需要17秒(1000万次):
static void Main(string[] args) {
var sw = new Stopwatch(); sw.Start();
int r;
for (int i = 1; i <= 100000000; i++) {
for (int j = 1; j <= 10; j++) {
MyDivRem (i,j, out r);
}
}
Console.WriteLine(sw.ElapsedMilliseconds);
}
static int MyDivRem(int dividend, int divisor, out int remainder) {
int quotient = dividend / divisor;
remainder = dividend - divisor * quotient;
return quotient;
}
Run Code Online (Sandbox Code Playgroud)
而Math.DivRem需要27秒.
.NET Reflector为我提供了Math.DivRem的代码:
public static int DivRem(int a, int b, out …Run Code Online (Sandbox Code Playgroud) 有没有理由在模块的Sub Main中启动用VB.NET编写的GUI程序(Windows应用程序),而不是直接在表单中?
编辑:程序不会采用任何命令行参数,它将始终作为GUI程序执行.
我试图在F#中获得此vb.net代码的完全等效(不起作用):
Function FastPow(ByVal num As Double, ByVal exp As Integer) As Double
Dim res As Double = 1
If exp < 1 Then
If exp = 0 Then Return res
exp = -exp
num = 1 / num
End If
Do While exp > 1
If exp Mod 2 = 1 Then
res = res * num
num = num * num
exp = exp >> 1
Loop
Return res * num
End Function
Run Code Online (Sandbox Code Playgroud)
我写了这个:
let FastPow num exp = …Run Code Online (Sandbox Code Playgroud) 是否有很好用的inout(参考.NET中的C#,byref(比如输出参数)参数)?
我觉得由参数用作输入和返回值引起的混淆比out参数的数量增加或返回数组或返回自定义类更糟糕.
方法调用真的很慢或者我的计算机出了什么问题吗?
static void Main(string[] args) {
Stopwatch sw = new Stopwatch(); sw.Start();
for (int i = 0; i < 10000000; i++) {
double z = Math.Pow(i,2);
}
Console.WriteLine(sw.ElapsedMilliseconds);
sw = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++) {
Noop();
}
Console.WriteLine(sw.ElapsedMilliseconds);
}
static void Noop() { }
Run Code Online (Sandbox Code Playgroud)
第一个循环需要1600 - 1700毫秒,而第二个循环在我的系统中需要3100 - 3200毫秒(Celeron D 2.53 Ghz 512 MB RAM Windows XP SP3 .NET 3.5).这是一个命令行项目.我用VB.Net得到了类似的结果.
编辑:我想我找到了答案.