![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Не надо передёргивать. Мы обсуждали вопрос о том, что проглотит меньше ресурсов. Тест был исключительно на эту тему. Первоначально ты мне доказывал, что преобразование в число "дешевле", теперь - откуда ни возьмись, нарисовался препод.
"string buf" я передаю только потому, что с самого начала так сделал. В этом и состояла моя идея. И студия тут ни при чём - там есть бинарник. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Veon |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 27.2.2007 Репутация: нет Всего: нет |
Ужасный тест
![]() Для единичного случая намного лучше подходи то, что написал PashaPash. Если уж ты хочешь обрабатывать большое кол-во строк, то есть намного лучше способы чем этот case ![]() Кое-чего поправил, чтобы более обьективно было Убрал
Лучше тест проводить на готовом массиве строк. Твоя прога с исправлениями (3-й способ работает только для положительных, можно его выкинуть)
Да, еще попробовал как оно работает на 1кк строк, после вызова твоего createFile немного офигел ![]() И проводи тесты лучше в release ![]() Зы: мои результаты Время затраченное на выполнение алгоритма без преобразования в число 196 Время затраченное на выполнение алгоритма с преобразованием в число 227 Время затраченное на alg3 17 Время затраченное на alg4 17 Хотя если в твоем методе с case поправить на
выдает 14 ![]() Это сообщение отредактировал(а) Veon - 8.2.2009, 22:31 |
||||||
|
|||||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Это зря, оно как бы подразумевалось, забивать все данные в память не всегда целесообразно. Относительно метода CreateFile делать его идеальным я не собирался, потому, что в программе он не используется, написан на скорую руку, вызван единственный раз. Сделал своё дело и свободен. Оставил я его только для сведения о том, как был сформирован файл. При замене энумератора форичем код действительно работает быстрее(не знал). Твои алгоритмы действительно показывают лучшие результаты. Тест надо запускать несколько раз, поскольк результаты могут отличаться. Идеальным вариантом было бы прогнать по каждому алгоритму несколько раз и выводить усреднённые значения, хотя...и так всё видно. Кроме того: в качестве результата выводятся только миллисекунды, но если запустить тест на слабой машине могут и секунды возникнуть , а учтены они не будут(это я так на всякий случай). вместо a1.Milliseconds.ToString() надо писать a1.ToString(). Это для полноты картины. В любом случае, в контексте темы, вывод один... -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Не надо передергивать. Я сказал про преобразование каждого символа в число vs деление. Прогони свой первоначальный вариант ![]() ![]() Какой? И, кстати, DateTime+TimeSpan => System.Diagnostics.Stopwatch. |
|||
|
||||
diadiavova |
|
||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Не надо передёргивать: мой первоначальный вариант подвергся критике по совершенно другому поводу.
Далее, после уточнения, что я этого не делаю(здесь ты просто пропёрся, по этому поводу претензий нет - со всеми бывает) ты заявил следующее И дальнейший спор развивался в контексте вопроса, что в данном случае лучше - преобразование в число или работа со строкой. И кстати: я не понял, ты уже не споришь с тем, что в данном конкретном случае лучше обрабатывать строку непосредственно? ![]() Идея со свитчкейсом была с самого начала, просто в шарпе она не очень удобная, из-за этого я сократил малость(я же не думал, что мой код будет рассматриваться под микроскопом). Код
На васике выглядит так
То бишь - 2 инструкции кейс вместо 10. По-моему мы говорили о скорости работы алгоритмов. А это ты к чему? Это сообщение отредактировал(а) diadiavova - 9.2.2009, 11:31 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||||
|
|||||||
PashaPash |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
отдельно о скорости, обычно об общем подходе.О скорости:
Вроде бы спор о производительности я утверждал только вот это. И первоначальный вариант я критиковал именно за "двойное преобразование". Точнее, за цепочку "уже готовый string->int игнорируется"->"возврат к строке"->"ручной энумератор"->"боксинг/анбоксинг"->"преобразование char в string (посимвольное)"->"преобразование string->int (посимвольно)". Видишь тут аж 5 (!) кастов каждого символа? А можно было сделать всего один, и обойтись делением. В данном конкретном случае это явно задача с каких нибудь курсов. И цель ее явно не научить перебирать символы в строке, а научить работать с целыми числами, делить с остатком и проверять четность. Задачи "найти количество символов 0 2 4 6 8 и 1 3 5 7 9" формулируются обычно совсем по-другому. Мой вывод - если человека раздразнить - он вылижет совй код ![]() Добавлено через 43 секунды
Это класс специально для меряния временем. |
||||||
|
|||||||
Veon |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 27.2.2007 Репутация: нет Всего: нет |
Ну вообще-то задача звучала так "Есть целое число, которое мы вводим с клавиатуры. И необходимо узнать сколько в этом числе нечетных и четных цифр. "
В стандартном методе PashaPash как раз таки работают с числами, вставить туда TryParse и вообще будет хорошо. diadiavova же считает в строке количество символов '0', '1'... Проглотит число qqq1aaa? На моей машине 9 case работают быстрее чем с массивами. Я думал что будет наоборот. Пример с массивами я приводил только чтобы показать, что есть методы быстрее твоего (ошибся и не привел ![]() А ты занимаешься преждевременной оптимизацией. Мало того что нет таких сферических прог в которых нужно обрабатывать миллионы строк, так в 1-й раз ты парсил каждую цифру, а во второй использовал Enumerator. Вести спор о ресурсах и скорости вычисления, когда за 10 секунд можно набрасать метод работающий аналогично твоему (не PashaPash), но в 10 раз быстрее ![]() Блин, пока писал уже то-же самое ответили ![]() Это сообщение отредактировал(а) Veon - 9.2.2009, 11:47 |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Для того, чтобы обсуждать общий подход, надо определиться для начала с критериями оценки оновго подхода. Я скопипастил исходный пример и исправлял его. Учитывая, что я применил другой подход, исправлять надо было более радикально. При дальнейшем обсуждении я написал, что в число преобразовывать вообще н следовало и мы это обсуждали. Возврата не было, я просто проигнорировал преобразованное число, ещё раз повторяю, что если бы я сам писал код с самого начала, то строку вообще не парсил бы. Здесь согласен(учитывая результаты теста). Здесь тоже спорить не буду, хотя твой "праведный гнев" был направлен совсем в другую сторону. Возникает интересная ситуация: первоначально ты критикуешь непосредственную работу со строкой, потом, когда выясняется, что критика была неуместной, начинаешь придираться к деталям, возникшим вследствие того, что код писался "не на выставку". Да нет, ещё и вот это как бы имеет отношение к делу Напомню: речь шла о "падении на отрицательных". Куда подвинула попытка его исправления мы видели - алгоритм заработал быстрее. Возможно, только Раз ты так уж уповаешь на условия, то давай не будем от них отступать. В условии шла речь о решении конкретной задачи, а не о способе её решения. Для того, чтобы "вылизать" код надо, как минимум знатькак это сделать. Вся фишка в том, что общую концепцию я не изменил при "вылизывании". Я всё равно обрабатываю строку непосредственно и алгоритм работает быстрее твого ![]() В программу число попадает в виде текста, в этом вся суть. Если бы исходные данные были числовыми, то и разговор был бы другим. В процессе обсуддения уже звучала мысль, что в условии речи о валидации не шло(то бишь: предполагается, что данные вводятся корректно), если требуется валидация, то и расклад(опять-таки) другой. Проверка данных - процедура недешёвая. Если исходить из предположения, что данные вводятся корректно, то выполнять её - расточительство. В 10 раз - это ты загнул. И потом: чо вы все до этого злощастного энумератора докопались, ну тормозит он малость, но даже с ним работает быстрее. ![]() -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Чойт опять сообщение дублируется
Это сообщение отредактировал(а) diadiavova - 9.2.2009, 12:49 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Veon |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 27.2.2007 Репутация: нет Всего: нет |
Да, загнул, в 11.5 раз А учитывая foreach с case - в 14 ![]() Хм, на рабочей машине результаты другие, метод с массивами в 3 раза быстрее метода с 9 case. Это сообщение отредактировал(а) Veon - 9.2.2009, 13:45 |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
diadiavova, да ладно отпираться, просто признайся что написал кривой код - и мы от тебя отстанем
![]() Это сообщение отредактировал(а) PashaPash - 9.2.2009, 14:21 |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Veon, На моей машине после замены энумератора форичем время на выполнение сократилось в ~1,5 раза.
PashaPash, А дело не в коде, а в подходе к решению конкретной задачи. Ты используешь шаблонный подход со стандартными алгоритмами, а я подхожу к вопросу более гибко ![]()
![]() Это сообщение отредактировал(а) diadiavova - 9.2.2009, 15:55 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Проверил первоначальный код. Парсить по одному символу(предварительно преобразовав в строку) - идея действительно плохая(признаю
![]()
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
diadiavova, проверьте на числе "---------" ;)
-------------------- СУВ, Partizan. |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Да, как бы, обсуждали это уже несколько раз. Изначально условились исходить из того, что вводимые данные корректны.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |