Страница: 1 | 2 |
|
Вопрос: Как быстрее ставить пикселы не используя DirectX
|
Добавлено: 03.09.08 20:10
|
|
Номер ответа: 19 Автор ответа:
Вопросов: 1 Ответов: 4
|
Профиль | | #19
|
Добавлено: 10.09.08 11:17
|
Проверил я. Мои предположения о разнице на порядке, увы, оказались неверными. Но разница все равно есть и мой код выигрывает почти 20% (14 против 11 секунд).
То-есть ты хочеш сказать - что вставил тот код что я выложил, кинул две кнопки на форму и получил такие результаты?
Но я клянусь тебе - у меня оба кода в Debug работают одинаково! (кстати незнаю как реализовать измерение времени програмным методом - знаю что через timer будет некоректно, поэтому замерял секундомером - 12 сек.)
К слову не понятно что имеется в виду под "построением проекта"?
- Release я так понимаю - тоесть готовый .ехе файл.
И опять же клянусь - в .ехе файле код с использованием using работает медленне.., может тебе подойти к этому делу серьезнее и еще раз все проверить, потому как ну не мог я где-то очень сильно накосячил
а если накосячил - найди ошибку - код у тебя есть. (только комент там не к месту вставлен)
Ну а про потерю памяти - ну сейчас не в этом дело, а в том что у меня нет плюсов в скорости от using
Ответить
|
Номер ответа: 21 Автор ответа:
Вопросов: 1 Ответов: 4
|
Профиль | | #21
|
Добавлено: 10.09.08 16:22
|
Ra$cal спасибо! (вообщето я и раньше видел подобное - с системным временем, только забыл))
А Stell Brand и Eros - объясните пожалуйсто следуйщее.
- Public Class Form1
- Declare Function GetTickCount Lib "kernel32" () As Integer
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Dim j, k As Integer
- Dim start_time As Integer = GetTickCount()
- Using gr = PictureBox1.CreateGraphics
- For j = 0 To 100
- For k = 0 To 100
- gr.DrawLine(Pens.Black, k, j, k, j + 1)
- Next
- Next
- End Using
- TextBox1.Text = GetTickCount() - start_time
- start_time = GetTickCount()
- For j = 0 To 100
- For k = 0 To 100
- PictureBox1.CreateGraphics.DrawLine(Pens.Black, k, j, k, j + 1)
- Next
- Next
- TextBox2.Text = GetTickCount() - start_time
- TextBox3.Text = (TextBox1.Text - TextBox2.Text) / TextBox2.Text * 100
- End Sub
- End Class
Согласно этому коду в Debug код с использованием using работает в среднем на 20% больше чем без ниего. В Release замедление и того больше - все 100%!!
Как все это понимать?
Stell Brand - ты точно проверял у себя?
Ответить
|
Номер ответа: 23 Автор ответа: EROS
Вопросов: 58 Ответов: 4255
|
Профиль | | #23
|
Добавлено: 11.09.08 01:12
|
А Stell Brand и Eros - объясните пожалуйсто следуйщее.
Объясняю:
1. Код в топку
2. Руки кривые
3. Твой секундомер сломаный
4. А за такой код
TextBox3.Text = (TextBox1.Text - TextBox2.Text) / TextBox2.Text * 100
вообще линчевать надо. Ты что нибудь о приведении типов слышал?
-
- using System;
- using System.Drawing;
- using System.Windows.Forms;
-
- namespace TestUsing
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- /* add handler */
- btnStart.Click += new EventHandler(btnStart_Click);
- }
-
- void btnStart_Click(object sender, EventArgs e)
- {
- string _userMessage = "====== Test #{0} ======\r\n";
- _userMessage += "WITHOUT USING:\t{1}\r\n";
- _userMessage += "WITH USING:\t\t{2}\r\n";
- _userMessage += "RESULT:\t\t\t{3:F2}%\r\n";
- _userMessage += "\r\n";
-
-
- for (int i = 0; i < 5; i++)
- {
- int result1, result2;
- int j, k;
-
- /* without using */
- result1 = Environment.TickCount;
- for (j = 0; j < 100; j++)
- {
- for (k = 0; k < 100; k++)
- {
- pictureBox1.CreateGraphics().DrawLine(Pens.Black, k, j, k, j + 1);
- }
- }
- result1 = Environment.TickCount - result1;
-
- /* with using */
- result2 = Environment.TickCount;
- using (Graphics graphics = pictureBox1.CreateGraphics())
- {
- for (j = 0; j < 100; j++)
- {
- for (k = 0; k < 100; k++)
- {
- graphics.DrawLine(Pens.Black, k, j, k, j + 1);
- }
- }
- }
- result2 = Environment.TickCount - result2;
-
- /* show result */
- Console.WriteLine(_userMessage, i + 1, result1, result2,
- (float)(result1 - result2) / result2 * 100);
- }
- }
- }
- }
Результаты:
-
- ====== Test #1 ======
- WITHOUT USING: 984
- WITH USING: 562
- RESULT: 75,09%
-
-
- ====== Test #2 ======
- WITHOUT USING: 1000
- WITH USING: 579
- RESULT: 72,71%
-
-
- ====== Test #3 ======
- WITHOUT USING: 968
- WITH USING: 594
- RESULT: 62,96%
-
-
- ====== Test #4 ======
- WITHOUT USING: 984
- WITH USING: 579
- RESULT: 69,95%
-
-
- ====== Test #5 ======
- WITHOUT USING: 1000
- WITH USING: 578
- RESULT: 73,01%
Как видишь использование using дает 70% выигрыш в скорости и не оставляет после себя мусора в памяти.
Ответить
|
Номер ответа: 25 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #25
|
Добавлено: 12.09.08 07:58
|
То-есть ты хочеш сказать - что вставил тот код что я выложил, кинул две кнопки на форму и получил такие результаты?
Но я клянусь тебе - у меня оба кода в Debug работают одинаково! (кстати незнаю как реализовать измерение времени програмным методом - знаю что через timer будет некоректно, поэтому замерял секундомером - 12 сек.)
- Release я так понимаю - тоесть готовый .ехе файл.
И опять же клянусь - в .ехе файле код с использованием using работает медленне.., может тебе подойти к этому делу серьезнее и еще раз все проверить, потому как ну не мог я
Пойми, ты можешь клясться что у тебя Pentium Pro обгоняет Intel Xeon Quad на перемножении матриц, но даже это не отменяет законов физики и здравого смысла.
Ну а про потерю памяти - ну сейчас не в этом дело, а в том что у меня нет плюсов в скорости от using
Если бы ты почитал что такое Using и какой его смысл понял бы абсурдность своего заявления.
Using не должен давать никакого ускорения (теоритически) - единственная его задача - это обеспечить корректное освобождение неуправляемых ресурсов.
И не нужно говорить что это не имеет отношения к быстродействию - имеет, потому что замусоривание памяти управляемыми ресурсами ведет к тому что сборщик мусора будет запускаться чаще.
В данном случае основное различие между моим и твоим вариантом состоит в другом - я создаю один объект Graphics и использую его для отрисовки 10000 линий. Ты же создаешь 10000 таких объектов.
Я запускал не твой код, а писал свой.
Вот сейчас запустил твой код. Получаю результат:
Запуск в Debug
Мой вариант: 468
Твой вариант: 577
Запуск в Release
Мой вариант: 452
Твой вариант: 562
т.е. грубо говоря те же 20% что всплыли и у меня.
Откуда у тебя разница в обратную сторону появилась я не знаю
На всякий случай:
Windows server 2008 x64 (Windows AERO отключен)
Intel Core 2 Duo E6750 2.67 GHz
2 GB RAM
ATI Radeon X1600
Для замера производительности GetTickCount использовать не обязательно.
Во-первых, можно обойтись без АПИ, просто используя System.Environment.TickCount.
Я же лично использую следующую конструкцию для замера времени:
- Dim start = Now
- For i = 0 To 100000
- Me.CreateGraphics.DrawLine(Pens.Black, 0, 0, 100, 100)
- Next
- Dim Length = Now.Subtract(start)
- MessageBox.Show(Length.ToString)
И получается вывод:
00:00:15.0500094
цифре 0.0500094 конечно не стоит сильно доверять Скорее 94 микросекунды всплыли из-за ошибки округления. Бери первые 3 знака после запятой.
Что касается запуска в Debug/Release - разницы здесь практически не должно быть (и как видишь - практически и нет). Потому что основное время будет выполняться код самого .NET Framework и код GDI+.
Пержде всего.
В отличие от VB6, в котором отладка выполнялась в интерпретаоре, в .NET интерпретатора нет.
Когда ты запускаешь проект, выполняется сборка exe-файла. Далее он запускается и к нему подключается отладчик Visual Studio.
В чем же разница между сборкой в Debug/Release, запуском под отладчиком или без отладчика.
Она состоит в том что при сборке Debug в файл записывается отладочная информация, кроме того отключаются все возможные оптимизации компилятора. Делается это для того чтоб можно было провести полноценную отладку.
В сборке Release отладочная информация не записывается и включается оптимизатор. Полученный exe-файл теоритически работает быстрее чем Debug-версия.
Кстати, даже если ты делаешь Release сборку, но запускаешь проект под отладчиком, JIT-комплиятор все равно не будет проводить оптимизацию - для этого нужно либо "руками" запускать exe-файл, без Visual Studio, либо из Visual Studio запускать проект через Debug - Start without debugging (Ctrl+F5).
В том примере который рассматриваем мы оптимизировать, я думаю, практически нечего, поэтому разницы между запуском в Debug и Release практически нет (разница в 4% которую видим скорее всего свзана с тем что отладчик немного замедляет работу приложения).
Ответить
|
Страница: 1 | 2 |
Поиск по форуму