|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Существует проект(написан еще до меня на C#). загружается фотография(работает фоном). По размеру фотографии поелементно создается матрица 20x20 из UserControl-компонентов. на компоненте: public System.Windows.Forms.Panel pnMain; public System.Windows.Forms.Label lblText; Очень долго загружается(у меня проц і5, а на производстве вообще мрак) Как ускорить работу кода? Можно переписать код, но принцып изменить немугу, там завязано много на этот принцып. Код процедуры: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79.
Спасибо за внимание! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2014, 18:06 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
нечего тут оптимизировать... может ежли только не pbMain.Controls.Add(r); а сперва создать массив и вкрячить его в конце через pbMain.Controls.AddRange(...) И delegate(object o, EventArgs e) { ... }; Опишите отдельно... просто громоздко... как-то... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2014, 18:39 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
SNenko, O_O Жуть! 400 запросов к БД! На каждой итерации таймер создаётся и запускается... Частично можно оптимизировать, если создать все используемые контролы один раз, например, при запуске программы. То есть сделать их полями, а не локальными переменными. Должен быть всего один запрос к БД. Возможно, чуть помогут вызовы методов SuspendLayout() и ResumeLayout() в начале и конце соответственно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2014, 19:00 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
SNenko, 20x20 из UserControl-компонентов - выбросить нахер компоненты тексты и фон рисовать поверх картинки , клики мыши отрабатывать на картинке. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2014, 19:02 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
petalvikЖуть! 400 запросов к БД! На каждой итерации таймер создаётся и запускается... не на итерации, а по клику ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2014, 19:04 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
А, таймер по клику запускается. Сразу не разглядел. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2014, 19:05 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
SNenko, поставь вместо pbMain.Visible = false; вызов pbMain.SuspendLayout(); А вместо pbMain.Visible = true; соответственнно вызов pbMain.ResumeLayout(); Также следует избавиться от анонимной функции и заменить её на обычную функцию. В коде используется захват локальной переменной r. Чтобы код откомпилировался нужно добавить в начале функции следующую строку: Код: c# 1.
Здесь предполагается что Cell является родителем для кнопки. Если есть еще один или несколько уровней вложенности, то не составит труда написать extension функцию FindParent<T> для класса Control которая найдет родителя нужного типа. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2014, 20:40 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
SNenko, 1) разделение логики и интерфейса, вспоминаем парадигму MVC, т. е. посреди настройки внешнего вида не должен быть код работающий с данными 2) вынести sql в отдельную процедуру на ms sql сервер -> оптимизация sql кода, пайджинг на стороне ms sql server'a и все такое 3) 2 сторонний databinding на основе механизмов NET После этого можно подумать дальше ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 04:31 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Василий ВикторовичSNenko, 1) разделение логики и интерфейса, вспоминаем парадигму MVC, т. е. посреди настройки внешнего вида не должен быть код работающий с данными 2) вынести sql в отдельную процедуру на ms sql сервер -> оптимизация sql кода, пайджинг на стороне ms sql server'a и все такое 3) 2 сторонний databinding на основе механизмов NET После этого можно подумать дальше Все бы ничего, только к коду топикстартера это имеет мало отношения ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 07:28 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Изопропил, Вот мне интересно откуда вы взяли что эти рекомендации не помогут? как минимум я тут вижу код требующий рефакторинга, правда истинное название этого немного другое ну да ладно, 1) MVC - причины: котлеты отдельно мухи отдельно, т. е. разнести как минимум настройку интерфейса и обращение к БД в 2 разные функции, именно функции а не реализованный в середине функции анонимный делегат 2) Sql, голый sql запрос выдает с головой уровень писавшего это, как минимум обвернуть это в хранимую процедуру и ее дергать о технологиях ОRM и иже с ними я промолчу, о пайдженге на стороне сервера чтобы не тянуть тысячи записей тоже 3) ручное создание ячеек как минимум дурно пахнет так как уже давным - давно применяют DataBindings колекций обьектов к элементам интерфейса причем биндинг является двух сторонним со всякими интересными плюшками в виде генераций подтаблиц и валидаторов пользовательского ввода P. S. код - результат человека только начавшего делать первые шаги в освоении языка и по этому допускающего определенные детские промахи, это исправимо, года через 1,5 после того как наберется опыта ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 07:55 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Василий ВикторовичВот мне интересно откуда вы взяли что эти рекомендации не помогут? Вы, не читая кода, дали абстрактные советы 1) анонимный делегат вызывается только при клике мышью - на быстродействие никак не влияет 2) SQL запрос - простое добавление записи, запрос с параметрами - всё в порядке. какой тут пейджинг и ORM? (что характерно - тоже по клику вызывается) 3)проблема здесь не в в отсутствии байндинга, а в создании сотен контролов достаточно рисовать текст непосредственно поверх картинки и клики отрабатывать на картинке ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 08:26 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Говоря о мухах и котлаетах, вы безусловно правы. Почищу код и выложу результат ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 10:07 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Быстрее работать не стало, но уменьшилось количество неточностей. Щас закину в масив. Использу pbMain.Controls.AddRange(...). Но это для порядка. Не думаю что поможет.. Буду делать обработку кликов на картинке pbMain. Спасибо за советы. Выложу потом следюущий код. это процедура: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
А это класы к ней: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 15:32 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Нащет скорости обработки ошибся. Если использовать pbMain.Controls.AddRange(cells), обработка ускоряется раза в полтора. предыдущий вариант(с класами): 2756 микросекунд используя AddRange : 1110 микросекунд но это всеравно много.. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Дело в том, что во время AddRange(как и в предыдущей поэлементной загрузке), изображение загружается кубиками. Это при условиях: pbMain.Visible=false; pbMain.SuspendLayout(); ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 16:06 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
SNenko, контролы то зачем нужны? клик ловить и текстовое сообщение показывать? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2014, 17:18 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Изопропил, Так до меня было. Поэтому, я изменяю по-этапно. Думаю, lblText, вообще можно убрать, заменив простой переменной. Это конструкто класа Cell: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 10:26 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
К стати, выяснилось, что в два раза быстрее оно работает, потомучто размещает в два раза меньше компонентов. Даже незнаю куда они с масива деваются.(картинка выше) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 10:46 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
SNenko, я правильно понимаю, что по клику нужно сделать запись в базу на секунду нарисовать красный прямоугольник? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 10:56 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
ИзопропилSNenko, я правильно понимаю, что по клику нужно сделать запись в базу на секунду нарисовать красный прямоугольник? Именно так. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 11:05 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
SNenkoК стати, выяснилось, что в два раза быстрее оно работает, потомучто размещает в два раза меньше компонентов. Даже незнаю куда они с масива деваются.(картинка выше) Тут моя ошибка я умножал: х*у. надо было просто number++; ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 11:06 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Получается, что поэлементно и массивом оно заносит почти одинаково(разница на 100 микросекунд). Я думаю, что много времени занимает поэлементная прорисовка. Незнаю как ее отключить.. Во всяком случае, код стал более читабелен(для меня) Приступлю к варианту с кликами на bictureBox. Тоесть, без масива, а с прорисовкой конкретного килика. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 11:10 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
SNenkoПриступлю к варианту с кликами на bictureBox. Тоесть, без масива, а с прорисовкой конкретного килика. правильный путь. потребуется одна панель, на ней рисуется картинка и закрашиваются прямоугольники и никаких лишних контролов ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 12:03 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Изопропил, Перфоманс Аналайзер вам в помощь, на нём увидите где программа больше всего тормозит и там уже будите думать, как это решить. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 14:31 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Roman MejtesИзопропил, Перфоманс Аналайзер вам в помощь, на нём увидите где программа больше всего тормозит и там уже будите думать, как это решить. Господа теоретики, не нужна мне помощь, я читать код умею. Да и задачка не у меня. В данном случае - тормоза на беспощадном и бессмысленном создании сотен windows контролов. Несчастный обработчик клика мыши - не нуждается в оптимизации. Если только с эстетической точки зрения ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 15:58 |
|
Как ускорить работу кода?
|
|||
---|---|---|---|
#18+
Roman MejtesИзопропил, Перфоманс Аналайзер вам в помощь, на нём увидите где программа больше всего тормозит и там уже будите думать, как это решить. я пользуюсь своим класом. Но спасибо Вам за совет! Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2014, 16:17 |
|
|
start [/forum/topic.php?fid=20&msg=38691373&tid=1402704]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
others: | 326ms |
total: | 478ms |
0 / 0 |