|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
когда коту делать нечего - он яйца лижет ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 16:51 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttРазницу убрать легко по-блочным чтением, т.е. не всего файла сразу, а блоками. Скорость чтения ты никак не сократишь. А экономия на миллисекундах, когда чтение выполняется минуты, это бесполезное занятие. Вобщем я к тому что разбор XML никак не сделать быстрее скорости чтения с SSD. Никакая многопоточность не поможет. Мой цикл 20061320 можно еще пооптимизировать, но схема: Код: c# 1. 2. 3. 4. 5. 6. 7.
никогда не обгонит чтение с SSD. Хотя бы потому что каждый GetAttribute() помимо кода внутри еще и new string(), да и многопоточность не бесплатна, потокобезопасные классы (Concurrent...) заметно медленнее своих небезопасных аналогов. Обшую скорость постановки в очередь на обработку 100-200 Мб/сек наверно можно натюнинговать, но рядовой SSD дает чтение 450-500, на SATA2 чтение 200-220. Дисковый кэш виндовса 3-4 Гб/сек. Тут даже HDD с его 100 Мб/сек сложно обогнать. ИМХУ ты диск с сеткой на 100 Мбит путаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 18:23 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TТут тюнинг всяких IsDigit() как раз повышает эту скорость. Я не говорю, что подобный тюнинг не повышает скорость. Я говорю, что подобными оптимизациями можно пренебречь. Скажем так, если понадобится, я найду способ оптимизировать скорость и при этом IsDigit трогать не буду, потому что это самая-самая бестолковая оптимизация, которую только можно придумать. Оптимизацией это вообще нельзя никак назвать, экономия микросекунд, которую можно увидеть на миллиардах операций? Да тут кладезь того, что можно сделать в плане оптимизации, как я говорил, по-блочная многопоточная обработка, кеширование, оптимизация самого алгоритма. Ну никак не IsDigit, который не ощущается на фоне остальной обработки. Ты когда первый раз в память гигабайт данных грузишь, что процессор у тебя в это время делает? Правильно, простаивает. А потом ты начинаешь заниматься "оптимизациями". Вот здесь и растут корни вселенского самообмана. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 20:16 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TВобщем я к тому что разбор XML никак не сделать быстрее скорости чтения с SSD. Никакая многопоточность не поможет. Мой цикл 20061320 можно еще пооптимизировать, но схема: Сам по себе разбор бесмысленный. Ты же что-то потом будешь делать с тем, что прочитал? Например, обрабатывать и куда-то записывать. Или вычислять. Или что-то ещё делать. Возможно твои действия потребуют нагрузки на память. И тут микрооптимизации это как зёрнышко для слона. И какой бы диск быстрый не был, пока данные читаются с диска, ты ничего не делаешь. Вот с чём надо работать, а не бороться с ветряными мельницами. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 20:19 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TХотя бы потому что каждый GetAttribute() помимо кода внутри еще и new string(), да и многопоточность не бесплатна, потокобезопасные классы (Concurrent...) заметно медленнее своих небезопасных аналогов. Это если тебе надо работать с разделяемыми ресурсами. Если ты найдёшь способ максимально изолировать данные друг от друга, или ещё лучше, работать с иммутабельными структурами, то пенальти за использование многопоточности будут оправданы многократным повышением общей производительности. Тут серебряной пули нет. Самое главное, что микрооптимизации это не то, что реально повышает производительность твоих приложений. Но реально отнимают время программиста, он его тратит на глупую ерунду, и ухудшает качество кода колоссально. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 20:22 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TИМХУ ты диск с сеткой на 100 Мбит путаешь. А вот тут ты ошибаешься. Файл может быть загружен как диска, так и по сети. Файл это абстракция ОС. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 20:24 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Кому неймётся ускорять разбор xml - генерите код под конкретную схему ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2016, 21:57 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ИзопропилКому неймётся ускорять разбор xml - генерите код под конкретную схему [youtube= ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2016, 08:13 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVostt, ты банальные слова написал, теорию. Ту нечему возразить. Разве что Закон Амдала не упомянул для полноты картины. Нет смысла спорить что грамотно спроектированный алгоритм с плохой реализацией гораздо проще оживить чем плохо спроектированный, но идеально закоденный. Но погоня за читабельностью может портить не только куски кода, но и алгоритм в целом. Грань тут тонкая. По поводу IsDigit() соглашусь, можно ее использовать, копеечная экономия. Я на эти грабли наступил когда писал свой DBF парсер, просто заменил if(x >= '0' && x <= '9') на if(x >= 48 && x <= 57), попутно внеся косметические изменения в код и получил ускорение. Какие тут можно выводы сделать? Но как оказалось 20059862 код ускорили косметические изменения, как ни странно. Мне привычнее (x >= '0' && x <= '9') просто потому что IsDigit() нет в С/С++ ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2016, 18:38 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TМне привычнее (x >= '0' && x <= '9') просто потому что IsDigit() нет в С/С++ ужос какой. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2016, 14:10 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Изопропил, isdigit ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2017, 20:06 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Dima TКакие тут можно выводы сделать? В том, что если тебе надо реально ускорить парсинг, то есть намного более эффективные способы это сделать и получить ощутимое ускорение, а не на жалкие не значащие миллисекунды, которые к тому же плавают от запуска к запуску (зависит от кучи факторов). Dima TМне привычнее (x >= '0' && x <= '9') просто потому что IsDigit() нет в С/С++ Учитывая, что C# работает с UTF-16, такой способ не является корректным. Что касается C/C++, если ты там работаешь с кодировками с переменным количеством байт (а это сегодня практически абсолютный стандарт во всём мире), то такое сравнение тоже не корректно. Мы люди взрослые и сами решаем как нам привычнее отстреливать себе ноги, я же акцентирую на этом внимание, так как форум читает много людей и среди них много новичков. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 04:03 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttУчитывая, что C# работает с UTF-16, такой способ не является корректным. Что касается C/C++, если ты там работаешь с кодировками с переменным количеством байт (а это сегодня практически абсолютный стандарт во всём мире), то такое сравнение тоже не корректно. не гони пургу - корректно и с UTF-16 и UTF-8 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 09:16 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Изопропилне гони пургу - корректно и с UTF-16 и UTF-8 Посмотри реализацию IsDigit и скажи нам, почему разработчики .NET не правы, а ты прав. И тогда поговорим о пурге. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 09:57 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttесли ты там работаешь с кодировками с переменным количеством байт (а это сегодня практически абсолютный стандарт во всём мире), то такое сравнение тоже не корректно. не путай тёплое с мягким - кодировка не влияет на классификацию кодовых точек(codepoint) UTF-32 - всегда 4 байта на codepoint - как это влияет на классификацию? теперь что касается собственно isDigit в юникоде цифрами являются не только ASCII 0..9 , но и всяческие Bengali U+09E6 .. U+09EF и т д isDigit для них вернёт true, но int.Parse их не поймёт Для задачи топикстартера и им подобных - адекватным как раз является c>='0'' && c<='9' , а не isDigit ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 11:02 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Изопропил, На самом деле я имел в виду суррогатные пары, но один только IsDigit в данном случае не поможет, обработка должна быть сложнее. Изопропилно и всяческие Bengali U+09E6 .. U+09EF и т д isDigit для них вернёт true, но int.Parse их не поймёт Всё верно. Но надо учиться учитывать и другие культуры по возможности, даже если в конкретном случае это вроде как и не нужно. ИзопропилДля задачи топикстартера и им подобных - адекватным как раз является c>='0'' && c<='9' , а не isDigit Адекватным является либо IsDigit, либо своя функция IsArabicDigit, но ни как не c>='0'' && c<='9', я даже не понимаю в чём тут спор, код должен быть простым, понятным, односложным, самодокументированным. В указанном тобой утверждении можно сделать ошибку, которую очень легко не заметить. Привыкнешь писать такой код потом тяжело будет работать в адекватной команде, где за такое дают по шапке. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 14:17 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
ИзопропилUTF-32 - всегда 4 байта на codepoint - как это влияет на классификацию? На самом деле UCS-4, из UTF в основном используются UTF-8 и UTF-16. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 14:20 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVostt, суррогатные пары UTF-16 (0xD800—0xDFFF) никак не влияют на проверку на ascii 0..9 UCS-4 и UTF-32 в 2017 году - одно и то же hVosttНо надо учиться учитывать и другие культуры по возможности, даже если в конкретном случае это вроде как и не нужно. именно поэтому isDigit и isNumber нужно использовать в полном сознании (проверка на попадание в категории Nd и No) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 15:01 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttIsArabicDigit вот тут и накрылся медным тазом "самодокументированный" код я, например, за именем этой фукции вижу проверку на диапазон U+06F0 .. U+06F9, хотя могу и заподозрить индоарабские U+0660 .. U+0669 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 15:30 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Изопропилсуррогатные пары UTF-16 (0xD800—0xDFFF) никак не влияют на проверку на ascii 0..9 UCS-4 и UTF-32 в 2017 году - одно и то же Проблема в том, что ты рассматриваешь символы как ASCII, когда работаешь с юникодом это не ASCII, так как символ может состоять из двух слов. Поэтому мимо. UTF-32 приравняли к UTC-4, чтобы не было путанницы. Изопропилименно поэтому isDigit и isNumber нужно использовать в полном сознании (проверка на попадание в категории Nd и No) Нужно, не спорю. Изопропилот тут и накрылся медным тазом "самодокументированный" код я, например, за именем этой фукции вижу проверку на диапазон U+06F0 .. U+06F9, хотя могу и заподозрить индоарабские U+0660 .. U+0669 Ты уже лепишь отсебятину )) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 07:25 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttИзопропилсуррогатные пары UTF-16 (0xD800—0xDFFF) никак не влияют на проверку на ascii 0..9 UCS-4 и UTF-32 в 2017 году - одно и то же Проблема в том, что ты рассматриваешь символы как ASCII, когда работаешь с юникодом это не ASCII, так как символ может состоять из двух слов. Поэтому мимо. UTF-32 приравняли к UTC-4, чтобы не было путанницы. херню несёшь, никакой путаницы нет codepoint ни из каких слов не состоит. "два слова" - суррогатные пары - исключительно особенность UTF-16 (d800..dfff)к чему ты их сюда приплёл? многобайтовый последовательности UTF-8 - первый байт 11xxxxxx, последующие - 10xxxxxxx отличия между UTF-32 и UCS-4 были в трактовке диапазона значений (изначально предполагалось, что будет задействован диапазон 0..7FFFFFFF нынче это 0..10FFFF UTF-32 - юникод консорциума, а UCS-4 - ISO10646 (ещё был померший UCS-2) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 10:07 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Изопропил"два слова" - суррогатные пары - исключительно особенность UTF-16 (d800..dfff)к чему ты их сюда приплёл? Ты из какой планеты прилетел? .NET работает со строками в кодировке UTF-16. Представляешь? все исключительные особенности UTF-16 — это то, с чем приходится жить, разрабатывая под .NET А при чём тут твои UTF-32/UCS-4 или UTF-8? Зачем вообще ты про них заговорил? К чему, для чего? В .NET используется UTF-16. Изопропилмногобайтовый последовательности UTF-8 - первый байт 11xxxxxx, последующие - 10xxxxxxx И чего? В .NET строках сидит UTF-16. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 11:57 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
hVosttВ .NET строках сидит UTF-16. и что теперь? UTF-16 ещё в Java и Javascritpt hVosttПроблема в том, что ты рассматриваешь символы как ASCII, когда работаешь с юникодом это не ASCII, так как символ может состоять из двух слов я рассматриваю символы как кодовые точки юникода кодовая точка представляется в UTF-16 суррогатной парой ("двумя словами") для плоскостей 1-16 где я что про ASCII сказал? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 12:08 |
|
Инкрементирование строки
|
|||
---|---|---|---|
#18+
Изопропиля рассматриваю символы как кодовые точки юникода кодовая точка представляется в UTF-16 суррогатной парой ("двумя словами") для плоскостей 1-16 Вообще-то ты прав, в плоскость суррогатных пар не попадают значения '0'..'9'. А я подумал про модифицирующие сѝмволы: 0̀1̀2̀3̀4̀6̀7̀8̀9̀... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 13:23 |
|
|
start [/forum/topic.php?fid=20&msg=39378634&tid=1400119]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 421ms |
0 / 0 |