![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
MuForum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 427 Регистрация: 13.6.2007 Где: Молдова, Кишинев Репутация: нет Всего: 4 |
Доброго времени суток.
Выкладываю готовый класс для вычисления контрольной суммы файла CRC32.
P.S. -> Когда-то идею для этого решение нашел где-то в интернете, переделал под свои нужны, а нужды заключались в скорости работы алгоритма и использовании класса под многоядерность. P.S. -> Если у кого-то есть идеи как ещё оптимизировать работу данного класса, прошу говорить. Буду только рад. - Данный класс реализован под многоядерность, чтобы каждый поток мог сделать экземплатор класса и использовать его. Это сообщение отредактировал(а) MuForum - 16.5.2011, 13:22 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли) |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
Честно говоря, код сильно не смотрел. Но бросилось в глаза самое грубое. Зачем в каждом экземпляре этот массив? Его нужно сделать статическим, в расшаренной памяти. Фактически это константы. Ну и как следствие:Зачем его инициализировать в каждом экземпляре? Достаточно один раз, проинициализировать, когда запускается первый экз. Вот немножко сократили использование память (1024 байта на каждый экземпляр) И ускорили работу ![]() можно капнуть и глубже, но пока и этого я думаю хватит. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
Щаз буду критиковать
![]() 1. Почему в разделе WinAPI ? 2. Почему ф-ция CalcSize не статическая ? И зачем вообще она нужна в классе, вычисляющем CRC ? 3. Класс завязан на чтение из файла. Лучше сделать его так, чтобы он работал с памятью, т.к. сегодня это файл, завтра - сеть... да мало ли ещё что 4. Почему бы из первой ф-ции CalcCRC32 не вызвать вторую со вторым параметром false ? Повторное использование кода - оно завсегда лучше 5. Зачем мешать winAPI и Си++ CRT (CreateFile и fopen) ? Вычислить длину файла можно и ф-циями CRT:
6. Константы BUFFERSIZE, CRC_MASK и CRC_POLY лучше сделать не define'ами, а static const unsigned int, чтобы при включении твоего h-ника не возникало перекрытия с другими переменными. 7. Почему переменная i типа int, а len - size_t ? Лучше сделать одинаково. 8. (возможно уже придирка, но...) Зачем нужна привязка к Windows (#include <windows.h>) ? Если из-за CreateFile, то см. п. 5, если из-за DWORD, то лучше пользоваться встроенными, а не M$-совскими типами. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
MuForum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 427 Регистрация: 13.6.2007 Где: Молдова, Кишинев Репутация: нет Всего: 4 |
# Вариант №2: (Класс под ОС Windows)
Это сообщение отредактировал(а) MuForum - 17.5.2011, 15:04 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли) |
|||
|
||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
MuForum, у тебя опять повторяется код:
и
и потом, я говорил не избавиться от define'ов, а переделать их в static const unsigned int... ok, лови
Это сообщение отредактировал(а) borisbn - 17.5.2011, 16:05 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
Этот цикл вызывается каждый раз при создании экземпляра. Не нужно, я уже писал вначале, ззачем такой оверхед? либо
либо, что лучше, вобще задать константами. можно хелпер небольшой написать для этого. Добавлено через 10 минут и 14 секунд Ну вот сделал из вашего кода небольшой хелпер. http://liveworkspace.org/code/325ff767078a...109f7799f1ba649 В данном исключительном случае, код надо копировать не из верхней части, а из нижней! ![]() Куда его копировать, надеюсь понятно. Init_CRC32_Table() вобще удалить нафиг, и конструктор походу можно удалить. |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
volatile, скажу по секрету (никому не говорите), я этот классик себе взял (чего добру пропадать) и сделал как Вы говорили, но чуток по другому
в Вашем же варианте
при многопоточности код заполнения массива может вызваться несколько раз. В данном случае - ничего страшного (кода-то кодт наплакал), а если там серьёзные операции... Мне понравилась идея в C# - там есть статический конструктор не для экземпляров, а для типа. Его достаточно просто описать и он вызовется гарантированно один раз. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
Ну это да, хотя ничего страшного не будет в данном случае. они же пишут одно и тоже ![]() небольшой оверхед в начале. Ну и поэтому я затем привел вариант с константами. Самый надежный и быстрый по-любому. С этим кода тоже не все шоколадно. например, вы написали int dummy = ...; в одном файле. а в другом файле объявлена глобальная переменная TCRC32 a; какой код будет выполнен первый? это неопределено. 50% можно нарваться на большие неприятности. здесь, если по-хорошему надо делать синглтон. Но мне его лень щас было писать. Проще быстрее и надежнее с константами, что и было сделано. Чем не нравиться? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
так она ж просто объявлена. таблицу ещё никто не юзает... хотя в общем случае - да. так тоже нехорошо. те же проблемы с многопоточностью. и потом, синглтоны - зло (щаз на меня набросятся) мягким знаком ![]() да нет... нравится. только неплохо бы вставить в комментарии код генерации этих констант, чтобы через год, открыв код, можно было не ломать голову, откуда они (константы) взялись. По-моему, мы воду в ступе толчём. IMHO и так всё понятно. Нет ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
||||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
это если без хелпера, вместо синглтона, тогда да, действительно, "а вдруг ..." Добавлено через 5 минут и 7 секунд в таком случае, конечно m_CRC32Table - тоже статик -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
GremlinProg, оооочень не хочется класс вычисления CRC завязывать на Windows. Можно, конечно, написать свою ф-цию interlock с ifdef'ами внутри... но, как-то это не кошерно
![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
GremlinProg |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну, префикс lock не распространяется на Windows, это архитектурная фича, а _InterlockedExchange - не функция, по большому счету (см. intrinsic), но если уж и заниматься оптимизацией, значит быть готовым и к таким "ifdef'ам", возможно, тут стоит задействовать, к примеру, ключ
и руководстоваться им в более узком направлении оптимизации Добавлено через 8 минут и 16 секунд ps: сам бы я не стал возиться с таким конструктором, это был просто вариант, чтобы учесть MT малой кровью -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
А вот так делать НЕЛЬЗЯ!!! Давайте рассуждать... Первый поток вызывает _InterlockedExchange( &inited, 1 ) Получает 0, начинает инициализировать массив, заметьте только начинает, еще не проинициализировал. В это время второй поток вызывает _InterlockedExchange( &inited, 1 ) Получает единицу, дескать все ОК, массив готов, возвращается, начинает считать CRC. Но массива у нас пока НЕТ! ![]() |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 6 Всего: 135 |
хмммм. а как же быть ? Я не про класс CRC - мы уже родили 2 варианта: 1. 2. Допустим мой тип (не экземпляр) должен инициализировать свой статический массив данными из файла... Чо делать ? Эххххх. Вполне возможно придётся на старости лет поизучать что-нибудь другое - До-диез, например... Всё-таки молодой, бурно развивающийся язык/framework... Для данной задачи даже есть готовое решение на уровне конструкции/синтаксиса языка:
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |