|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima Tпри тестах на скорость попробовал поменять на числа, стало быстрее. Было бы это мелочью, я бы не заметил из-за погрешности измерений, тестил разбором большого файла Это бред. I/O операции перекрывают даже самые конские вычислительные расходы. А чтобы увидеть разницу в том, в чём разницы совершенно точно (на уровне IL кода) быть не может ну никак вообще ни при каких обстоятельствах, надо обладать даром, которым обладают только свидетели Иеговы ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 18:07 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttВот из-за кучи мелких заблуждений, из-за недоверия к компилятору, который отлично умеет оптимизировать код, вырастают твои никому не нужные костыли. Хотел тестом проверить и наткнулся на такую интересную хрень тестФайл отсюда http://services.fms.gov.ru/info-service.htm?sid=2000 Код: 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.
При запуске как в тесте результат такой Код: c# 1. 2. 3.
Но если раскаментить кусок кода, то у меня так получается Код: c# 1. 2. 3. 4.
В общем ясно что ничего не ясно. На всякий случай повторил трижды все как написал, результат повторяется стабильно. Можешь у себя попробовать. Главное что я понял - мою методику тестирования запросто мог опошлить компилятор, возможно даже тот который IL-код в машинный превращает. PS На счет IO не согласен. В моем случае DBF сначала распаковывается, в результате чего чтение может быть не с диска, а из кэша виндовса. Да и диск SSD с чтением 700 Мб/сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 18:55 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TВ DBF юникода не бывает, там ASCII кодировки UTF-8 как будем трактовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 18:57 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TВ моем случае DBF сначала распаковывается, куда распаковывается? в память или на диск? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 18:59 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Путние люди постфиксы юзают. Плохие_Девочки.address Плохие_Девочки(1).address Плохие_Девочки(2).address И никаких переполнений! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 19:05 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ИзопропилDima TВ DBF юникода не бывает, там ASCII кодировки UTF-8 как будем трактовать? Структура DBF поищи в Табл.9 как трактовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 19:34 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ИзопропилDima TВ моем случае DBF сначала распаковывается, куда распаковывается? в память или на диск? диск ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 19:35 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Cat2Путние люди постфиксы юзают. Плохие_Девочки.address Плохие_Девочки(1).address Плохие_Девочки(2).address И никаких переполнений! ИМХУ Путние люди делают идентификаторы числовыми и подобные топики не возникают за ненадобностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 19:57 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TХотел тестом проверить и наткнулся на такую интересную хрень Так ты файлик то возьми нормального размеру, что бы регистрах процессора не помещался) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 20:26 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ЕвгенийВDima TХотел тестом проверить и наткнулся на такую интересную хрень Так ты файлик то возьми нормального размеру, что бы регистрах процессора не помещался) Там файлик 1 Гб+. Ссылку дал, можешь качнуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 20:28 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Если кто не заметил, повторю результаты моего очень примитивного замера 20057914 Код: c# 1. 2. 3.
Но если раскаментить кусок кода, то у меня так получается Код: c# 1. 2. 3. 4.
Разница времени работы одного и того же кода отличается в 2 (ДВА) раза!!! Трижды перекомпилировал и запускал. Кто-нибудь повторите замеры, пожалуйста. Я в шоке! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 20:45 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima T, Странно. Первый случай скорее всего как раз показывает именно просадки из-за операций в памяти, когда IsDigit быстрее чем, сравнение (так может быть только если разница чем-то нивелируется). А ты говорил что-то там про SSD. Сравнил блин элементарную операцию на процессоре и операцию чтения с диска, которая проходит через несколько слоёв системы (драйвера, операция с диском...). Это на порядки всегда будет медленнее, чем элементарные вычисления. Надо три теста выполнять отдельно и нужен разогрев. Выполнять тесты последовательно в одной и той же программе -- значит получить заведомо неверные результаты. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 21:43 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
SSD и IO тут ни при чем, в тесте сначала файл читается в массив, дальше циклы по массиву Код: c# 1. 2. 3.
Поизучал IL-код циклов обоих EXE, он абсолютно одинаковый Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Попутно подтвердилось 20057782 что if(b >= 48 && b <= 57) и if(b >= '0' && b <= '9') компилируется в одно и тоже. Еще одно наблюдениеРешил поправить чтение из файла на это Код: c# 1. 2. 3. 4. 5.
Больше ничего не трогал. Менял код туда-обратно несколько раз. Результат стабильный. Вот результат до правки Код: c# 1. 2. 3.
вот после Код: c# 1. 2. 3.
вот поменял два последних цикла местами Код: c# 1. 2. 3.
IL-код циклов тот же самый. Я проверил. Получается что изменения одной части кода меняют скорость другой части. Знать бы еще почему и как этим пользоваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 12:27 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttЭто бред. I/O операции перекрывают даже самые конские вычислительные расходы. Тут ты не совсем прав. I/O работает параллельно с процом. Если чтение с диска достаточно быстрое, то может опережать. Особенно при последовательном чтении. Давай мой тест просчитаем: файл 1.1 Гб обрабатывается 600 мс (предварительно скопированный в память), т.е. скорость моей обработки 1,8 Гб/сек. Скорость чтения рядового SSD 450-500 Мб/сек, т.е. всего в 4 раза ниже . В теле цикла у меня одинокий if(), замени его на что-то реальное и чтение с диска начнет опережать расчеты. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 12:39 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TSSD и IO тут ни при чем Ошибаешься, почитай немного про работу с памятью на уровне ОС, а также про работу с памятью на уровне .NET, куда кладутся маленькие объекты и куда большие и чем это может быть чревато. Совершенно точно утверждать, как будет вести себя программа нельзя, но знать, что память это не волшебное место с моментальным доступом, тоже пригодиться. В разных случаях итоговая производительность может быть разной. Dima T Получается что изменения одной части кода меняют скорость другой части. Знать бы еще почему и как этим пользоваться. Оптимизации компилятора, кеширование. Пользоваться этим надо только тогда, когда ты выяснил участок кода, на котором обнаружилось ощутимое падение производительности, так называемый bottleneck, не раньше. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 13:32 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima T всего в 4 раза ниже В твоей обработке тоже есть отнюдь не вычислительные операции, операции чтения из памяти тоже могут быть довольно затратны. Можно ускорить всё действо, при чём многократно, если читать файл блоками, а не цельным куском и обрабатывать его асинхронно в несколько потоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 13:35 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima T, при чём понятие "в 4 раза" сильно растяжимое. 4 больше 1 в 4 раза, т.е. больше на 3. 40 больше 10 в те же 4 раза, но уже больше на 30. 4000000 больше 1000000 в 4 раза, но уже на 3 миллиона. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 13:37 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttDima T всего в 4 раза ниже В твоей обработке тоже есть отнюдь не вычислительные операции, операции чтения из памяти тоже могут быть довольно затратны. Можно ускорить всё действо, при чём многократно, если читать файл блоками, а не цельным куском и обрабатывать его асинхронно в несколько потоков. Далеко не все файлы можно обрабатывать в несколько потоков. DBF легко, TXT сложнее но можно, XML или JSON - нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 13:54 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TXML или JSON - нельзя Ты серьёзно? Нельзя? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 14:10 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima T, Нет смысла читать из файла в несколько потоков, есть смысл в несколько потоков запускать обработку прочитанных блоков, если операция обработки затратная. Уточню чтобы ты правильно меня понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 14:14 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttDima T, Нет смысла читать из файла в несколько потоков, есть смысл в несколько потоков запускать обработку прочитанных блоков, если операция обработки затратная. Уточню чтобы ты правильно меня понял. С этим согласен, но само чтение того же XML это заметно посложнее чем код в цикле моего теста. Простой пример из реального рабочего кода. Разбор XML файла. Код читает через XmlReader() и пишет в Dictionary<String, List<DataRow>>. Т.е. никакого лишнего IO кроме чтения файла. Внутри цикла код достаточно простой. Получение тэгов, атрибутов, заполнение DataRow, сохранение в Dictionary. Тут нечего соседним потокам раздавать. Разве что "сохранение в Dictionary" заменить на постановку в ConcurrentQueue, а в другом потоке оттуда в Dictionary А теперь цифры: разбор файла в 48 Мб идет 2.1 сек., скорость 23 Мб/сек. И где тут затык в IO ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 14:42 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TРазве что "сохранение в Dictionary" заменить на постановку в ConcurrentQueue, а в другом потоке оттуда в Dictionary Затестил, просто закамментил все что можно вынести в другой поток (добавление в Dictionary, проверку корректности заполнения и т.п.). Итого 0.8 сек. или 59 Мб/сек. Лучше, но тоже не сказать что много. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 15:23 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TА теперь цифры: разбор файла в 48 Мб идет 2.1 сек., скорость 23 Мб/сек. И где тут затык в IO ? Это очень низкая скорость, они нивелирует затраты на тот же IsDigit не просто полностью, а с лихвой. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 15:56 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TЛучше, но тоже не сказать что много. Сравни чтение 1Гб файла с обработкой и без (чисто чтение). Разница будет, но сравни время на чтение и разницу между обработкой и без. Разницу убрать легко по-блочным чтением, т.е. не всего файла сразу, а блоками. Скорость чтения ты никак не сократишь. А экономия на миллисекундах, когда чтение выполняется минуты, это бесполезное занятие. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 15:58 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttDima TА теперь цифры: разбор файла в 48 Мб идет 2.1 сек., скорость 23 Мб/сек. И где тут затык в IO ? Это очень низкая скорость, они нивелирует затраты на тот же IsDigit не просто полностью, а с лихвой. Это скорость обработки , разбора. Тут тюнинг всяких IsDigit() как раз повышает эту скорость. hVosttDima TЛучше, но тоже не сказать что много. Сравни чтение 1Гб файла с обработкой и без (чисто чтение). Разница будет, но сравни время на чтение и разницу между обработкой и без. Разницу убрать легко по-блочным чтением, т.е. не всего файла сразу, а блоками. Скорость чтения ты никак не сократишь. А экономия на миллисекундах, когда чтение выполняется минуты, это бесполезное занятие. Так я же написал что убрал всю обработку. Только чтение оставил. Код цикла такой Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Это все что осталось. Что тут убрать? Напомню это работает 0.8 сек. Теперь тестим чтение Код: c# 1. 2. 3. 4. 5. 6. 7.
17 мс, это нормально, потому что он давно в кэше ОС целиком. Вот и получается что 0.8 сек. это время работы цикла разбора. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 16:38 |
|
|
start [/forum/search_topic.php?author=RAZ_DVA_TRI&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
others: | 704ms |
total: | 914ms |
0 / 0 |