-
Почему System.Drawing.Drawing2D.Matrix такой медленый?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace WindowsApplication1
private void MyTransformPoints(PointF[] pts)
}
private void button1_Click(object sender, EventArgs e)
;
int Ticks = System.Environment.TickCount;
for (int i = 0; i < n; i++)
matrix.TransformPoints(Points);
Ticks = System.Environment.TickCount - Ticks;
MessageBox.Show(Ticks.ToString());
}
private void button2_Click(object sender, EventArgs e)
;
int Ticks = System.Environment.TickCount;
for (int i = 0; i < n; i++)
MyTransformPoints(Points);
Ticks = System.Environment.TickCount - Ticks;
MessageBox.Show(Ticks.ToString());
}
}
} В первом случае результат ~ 4500 Во втором ~ 270 Или я чего то не понимаю?
-
Забудь про производительность на дотенет. Тем более при использовании GDI+.
-
> homm © (03.11.07 20:11) [1]
Причем здесь производительность .NET. Вот это ассемблер что ли: private void MyTransformPoints(PointF[] pts)
}
Работает на порядок быстрее, чем стандартная функция. Мне интересно почему. Я сравниваю код для .NET с кодом для .NET. Производительность .NET относительно нативного кода меня в данный момент АБСОЛЮТНО не интересут.
-
Ну скажите, как можно было реализовать умножение матрицы на вектор, что бы оно так тормозило?
-
> [3] Рамиль © (06.11.07 09:09) > Ну скажите, как можно было реализовать умножение матрицы > на вектор, что бы оно так тормозило?
А ты не думаешь, что тормозит не тело функции, а ее вызов? Выкладывали здесь асемблерный код доступа к windows.forms.color.black или что-то в этом роде, там полный северный зверь. Здесь почти то-же самое, System.Drawing.Drawing2D.Matrix.TransformPoints, пока до нее дойдет в дереве сборок…
-
> homm © (06.11.07 09:38) [4]
Мм.. Переделал пример(передаю сразу массив на 200 000 точек), matrix.TransformPoints стал выполняться в два раза медленнее чем MyTransofrmPoints в предыдущем примере (получается, что вызов matrix.TransformPoints всего лишь в два раза медленнее чем вызов Form1.MyTransformPoints). А MyTransformPoints вообще за 16. Зависмость от количества точек линейная. using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace WindowsApplication1
}
public virtual void MyTransformPoints(PointF[] pts)
}
private void button1_Click(object sender, EventArgs e)
private void button2_Click(object sender, EventArgs e)
}
} MyTransformPoints ~ 16 Matrix.TransformPoints ~ 550
-
> Random r = new Random(); > points = new PointF[200000]; > for (int i = 0; i < 200000; i++) > { > points[i].X = r.Next(1000); > points[i].Y = r.Next(1000);
Идея объектно-ориентированного программирования, доведенная до маразма.
-
> homm © (06.11.07 13:19) [6] > > > Random r = new Random(); > > points = new PointF[200000]; > > for (int i = 0; i < 200000; i++) > > { > > points[i].X = r.Next(1000); > > points[i].Y = r.Next(1000); > > Идея объектно-ориентированного программирования, доведенная > до маразма.
dotNet, в отличие от Java 6 Mustang, не умеет инлайнить Get/Set-методы. Каждое обращение к свойству ведёт к вызову геттера.
-
> [7] iZEN © (06.11.07 19:13)
При чем здесь это? Я о том, что для 2-х функций Random и randomize, и одной переменной RandomSeed создан отдельный класс. В этом маразм. Что там вызывается, инлайн или прерывание биоса, мне без разницы.
-
Хочу проверить прямым вызовом из dll, но что-то я совсем запутался в этих типах.. Что надо передать в GdipTransformMatrixPoints и правильно ли она экспортирована: [DllImport("gdiplus.dll", CharSet = CharSet.Auto)]
public static extern int GdipTransformMatrixPoints(IntPtr matrix, PointF[] pts, int count);
В CIL передается NativeMatrix IL_0017: ldfld native int System.Drawing.Drawing2D.Matrix::nativeMatrix
-
>> iZEN © (06.11.07 19:13) [7]Та фто Фы гафарите... public static class Program
set
}
}
public static void Main()
0000003b ret
public static class Program
[MethodImpl(MethodImplOptions.NoInlining)]
set
}
}
public static void Main()
0000004c ret
-
00000016 call dword ptr ds:[009630CCh] и 00000020 call dword ptr ds:[009630C8h] 00000026 mov esi,eax
Ну точно не инлайнит.
-
>Ну точно не инлайнит.
И не удивительно. Особенно для тех, кто умеет внимательно читать.
-
Вы бы лучше по теме что нибудь сказали... Я даже готов согласится, что круче Java ничего нет (но на ней переделывать не буду) :-D
-
> [13] Рамиль © (12.11.07 13:05) > Вы бы лучше по теме что нибудь сказали...
GDI+ отстой?
-
Ну... такой вывод я и сам могу сделать:) мне б что нить поконструктивнее. Хотя бы ответить на > Рамиль © (07.11.07 09:26) [9]
на pinvoke.net нет этой функции.
-
ну все таки ГДИ+ позволяет, особо не заморачиваясь, выводить линии и текст с антиалиасингом, пускай и относительно медленно :)
-
> Ну... такой вывод я и сам могу сделать:) мне б что нить > поконструктивнее.
Касаемо сабжа, то кроме как криворукостью индийского программера, действительно, объяснить эффект сложно.
|