Я написал две программы. Одну на Java, вторую на C# с абсолютно одинаковым содержимым, чтобы просто сравнить производительность. Результаты были удивительными. После этого я обратился к преподавателю, чтобы выяснить, в чем дело (шарповский код выполнялся в 8 (!!!) раз дольше). На его машине (VS 2008) он переключил с Debug на Release в студии, после чего время выполнения программы сократилось в 3 раза. Я пришел домой и тот же трюк не сработал (VS 2013).
В общем, ищу совета по профилям в Visual Studio. Как "включить оптимизацию"?
Код шарпа:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BoxingTest
{
public abstract class BoxedVal
{
public abstract BoxedVal Add(BoxedVal other);
public abstract bool LessThan(BoxedVal other);
public abstract bool GreaterThan(BoxedVal other);
}
public class BoxedInt : BoxedVal
{
public int Value;
public BoxedInt(int value)
{
Value = value;
}
public override BoxedVal Add(BoxedVal other)
{
BoxedInt i = other as BoxedInt;
return new BoxedInt(Value + i.Value);
}
public override bool LessThan(BoxedVal other)
{
BoxedInt i = other as BoxedInt;
return Value < i.Value;
}
public override bool GreaterThan(BoxedVal other)
{
BoxedInt i = other as BoxedInt;
return Value > i.Value;
}
}
class Program
{
private static int Fib(int nn)
{
BoxedVal one = new BoxedInt(1);
BoxedVal a = one;
BoxedVal b = one;
BoxedVal n = new BoxedInt(nn);
BoxedVal thousand = new BoxedInt(1000);
for (BoxedVal i = new BoxedInt(2); i.LessThan(n); i = i.Add(one))
{
BoxedVal c = a.Add(b);
a = b;
b = c;
if (b.GreaterThan(thousand))
{
a = one;
b = one;
}
}
return (b as BoxedInt).Value;
}
static void Main(string[] args)
{
int times = 5;
int n = 20000000;
int total = 0;
for (int i = 0; i < times; i++)
{
var start = DateTime.Now;
int val = Fib(n);
int dt = (DateTime.Now - start).Milliseconds;
total += dt;
Console.WriteLine(val);
Console.WriteLine("Elapsed: {0} ms", dt);
}
Console.WriteLine("Average: {0} ms", total / times);
Console.ReadLine();
}
}
}
Код на Java:
abstract class BoxedVal
{
public abstract BoxedVal Add(BoxedVal other);
public abstract boolean LessThan(BoxedVal other);
public abstract boolean GreaterThan(BoxedVal other);
}
class BoxedInt extends BoxedVal
{
public int Value;
public BoxedInt(int value)
{
Value = value;
}
@Override
public BoxedVal Add(BoxedVal other)
{
BoxedInt i = (BoxedInt)other;
return new BoxedInt(Value + i.Value);
}
@Override
public boolean LessThan(BoxedVal other)
{
BoxedInt i = (BoxedInt)other;
return Value < i.Value;
}
@Override
public boolean GreaterThan(BoxedVal other)
{
BoxedInt i = (BoxedInt)other;
return Value > i.Value;
}
}
public class BoxingTest {
private static int Fib(int nn)
{
BoxedVal one = new BoxedInt(1);
BoxedVal a = one;
BoxedVal b = one;
BoxedVal n = new BoxedInt(nn);
BoxedVal thousand = new BoxedInt(1000);
for (BoxedVal i = new BoxedInt(2); i.LessThan(n); i = i.Add(one))
{
BoxedVal c = a.Add(b);
a = b;
b = c;
if (b.GreaterThan(thousand))
{
a = one;
b = one;
}
}
return ((BoxedInt)b).Value;
}
public static void main(String[] args) {
int times = 5;
int n = 20000000;
long total = 0;
for (int i = 0; i
System.out.println("Average: "+(total/times)+" ms");
}
}
Ответ
Скорее всего, Вы запускаете Ваше приложение кнопкой F5 - Start Debugging, а Ваш преподаватель Ctrl + F5 - Start Without Debugging. У меня C#-код выполняется следующее время Debug, с отладчиком: 756ms Debug, без отладчика: 989ms Release, с отладчиком: 844ms Release, без отладчика: 388ms Java-код выполняется Release (Run): 159ms Debug: 174ms UPDATE: Забавно, увеличил константу до 200 000 000 (в 10 раз). Теперь C# "обгоняет": Average: 863 ms Java: Average: 1296 ms
Комментариев нет:
Отправить комментарий