Ненавижу BGCPControlBar.
Одна из самых "индусокодных" библиотек, не смотря на то, что написана русскими.
Мега-функции на пару тысяч строк. Невиртуальность тех функций, которые следовало бы сделать виртуальными.
Типичный стиль работы с ней -- отнаследоваться, переопределить одну-две функции, ПОЛНОСТЬЮ скопировав их тела из исходников, а потом подправить одно-два условия.
У нас в конторе есть даже особый мем --"багабецеже".
А теперь эту гадость включили в состав нового MFC в 2008й и 2010й студиях.
Вот и сегодня поправил багу у них, из-за которой мой софт грузился на 6 секунд! дольше. Буст с 16 до 10 секунд -- вполне заметный прирост.
Суть баги -- CBCGPShellTree долго строит дерево папок. Если надо показать c:\users\bitfield\desktop, то делает оно это 8 секунд! Логи показали, что 6 секунд оно строит список файлов для папки Computer, а вернее, 5-6 секунд висит на GetAttributesOf у первого элемента, пытаясь узнать, есть ли в нем подпапки.
Догадались?
Первый элемент -- конечно же A:, но дисковода у меня нет физически. Добавил проверку на removable и вуаля, эта ветка дерева строится уже за 0.5 секунды.
Посмотрел исходики в MFC 2008|2010. (файл AfxShellTreeCtrl.cpp). Там эта бага не исправлена.
2010-12-28
2010-12-20
Автоматическое обновление svn:externals
В текущем проекте через svn:externals подключается 25 либ, причем не в единый корень, а в нескольких местах (в 5 или 6 местах).
Написал тут скрипт, который автоматически выставляет экстерналы на нужные ревизии.
Написал тут скрипт, который автоматически выставляет экстерналы на нужные ревизии.
2010-12-14
[boost.build][trick] Ускорение сборки в boost.build
boost.build всем хорош, кроме скорости.
К примеру, анализ того, какие файлы надо пересобрать, на моем проекте (30+ либ + boost) занимает 42 секунды.
Оказывается, решение было найдено полтора года назад.
http://lists.boost.org/boost-build/2009/04/21734.php
Человек переписал стандартный анализатор инклюдов так, чтоб тот игнорировал файлы по регекспу.
добавив "в игнор" стандартные хедеры (у них нет расширения) и хедеры буста (^boost/) - получил время анализа в 22 секунды.
Уже можно жить...
К примеру, анализ того, какие файлы надо пересобрать, на моем проекте (30+ либ + boost) занимает 42 секунды.
Оказывается, решение было найдено полтора года назад.
http://lists.boost.org/boost-build/2009/04/21734.php
Человек переписал стандартный анализатор инклюдов так, чтоб тот игнорировал файлы по регекспу.
добавив "в игнор" стандартные хедеры (у них нет расширения) и хедеры буста (^boost/) - получил время анализа в 22 секунды.
Уже можно жить...
2010-11-26
рабочее
Бета-тестер: кста что интересно оказалось
ты собираешь инсталлятор foo_bar.exe
я его переименовываю для вебщиков в foo_bar_baz.exe
а они его для сайта переименовывают в foo_bar.exe
ты собираешь инсталлятор foo_bar.exe
я его переименовываю для вебщиков в foo_bar_baz.exe
а они его для сайта переименовывают в foo_bar.exe
2010-10-11
Одобе такое одобе
Есть проект, сохраненный как Flash CS5 Uncompressed Document.
Так вот, если файл DOMDocument.xml (хранящий содержимое основного таймлайна) чем-то занят (да хотя-бы просматривается по f3 из FAR-а), то при сохранении Adobe Flash CS5 конечно-же упадет.
И заберет DOMDocument.xml с собой в Валхаллу.
Понятное дело, что после перезапуска этот проект уже не откроется.
Хорошо хоть проект был заHGшен.
Так вот, если файл DOMDocument.xml (хранящий содержимое основного таймлайна) чем-то занят (да хотя-бы просматривается по f3 из FAR-а), то при сохранении Adobe Flash CS5 конечно-же упадет.
И заберет DOMDocument.xml с собой в Валхаллу.
Понятное дело, что после перезапуска этот проект уже не откроется.
Хорошо хоть проект был заHGшен.
2010-09-28
программирование похоже на ходьбу по лабиринту -- можно замерить и даже увеличить линейную скорость ходьбы, но это не заменит намного более важного правильного выбора на перекрестках.
(c)
(c)
2010-09-08
2010-08-26
Странное (о выравнивании)
MSVC: bool 2 3 4 char 2 3 4 short 4 6 8 int 8 12 16 GCC bool 2 3 4 char 2 3 4 short 2 4 4 int 4 8 8
2010-06-25
Обрезалка ресурсов.
В VC2008sp1 и VC2010 в состав MFC входят новые классы для Ribbon-like UI.
Можно выбрать одну из пяти тем для приложения (aqua, blue, black, silver, windows7).
При статической компиляции внутрь экзешника попадают ресурсы всех тем.
Если в приложении есть переключение тем, это гуд.
А если Ваше приложение всегда должно быть одного цвета -- как то жалко тратить больше 700 KB на ресурсы, которые никогда не используются.
А если учесть то, что это PNG и они плохо жмутся пакерами...
Вот, набросал за часик на коленке питонячий скрипт, который это лечит.
Можно выбрать одну из пяти тем для приложения (aqua, blue, black, silver, windows7).
При статической компиляции внутрь экзешника попадают ресурсы всех тем.
Если в приложении есть переключение тем, это гуд.
А если Ваше приложение всегда должно быть одного цвета -- как то жалко тратить больше 700 KB на ресурсы, которые никогда не используются.
А если учесть то, что это PNG и они плохо жмутся пакерами...
Вот, набросал за часик на коленке питонячий скрипт, который это лечит.
import sys from ctypes import * w32 = windll.kernel32 def get_res_list(fname): handle = w32.LoadLibraryW(fname) if not handle: return None types = [] def types_callback(handle, t): try: types.append(cast(t, c_wchar_p).value) except: pass return True types_callback_t = CFUNCTYPE(c_void_p, c_wchar_p, c_long) fun = types_callback_t(types_callback) w32.EnumResourceTypesW(handle, fun, 0) result = [] def names_callback(h, t, n): try: t = cast(t, c_wchar_p).value n = cast(n, c_wchar_p).value result.append((t,n)) except e: print e return True names_callback_t = CFUNCTYPE(c_void_p, c_wchar_p, c_wchar_p, c_long) fun = names_callback_t(names_callback) for t in types: w32.EnumResourceNamesW(handle, c_wchar_p(t), fun, 0) w32.FreeLibrary(handle) return result NOT_USED = ('AQUA', 'SILVER', 'WINDOWS7', 'BLACK') is_not_used = lambda x: x[1].split('_')[0] in NOT_USED def remove_resources(fname, not_used): handle = w32.BeginUpdateResourceW(fname, False) if not handle: return False ok = True try: for t,n in not_used: w32.UpdateResourceW(handle, t, n, 0x409, None, 0) except e: print e ok = False w32.EndUpdateResourceW(handle, not ok) return ok fname = u'd:\\app.exe' not_used = filter(is_not_used, get_res_list(fname)) print remove_resources(fname, not_used)
2010-05-04
2010-03-24
утка в зайце strikes back
Флеш-баннер с появляющимся и гаснущим текстом и картинкой.
50 килобайт...
Вроде и немного, но откуда?
....
Представляю внутренний монолог его разработчика:
А давай используем для красивостей tweening-компонент (на АС3), который читает, что ему делать, из xml. В котором опишем используемые шрифты, цвет фона, и переходы между "сценами" (текстом и картинкой). А текст на баннере мы будем хранить как html, конечно же в этом же xml, в percent-encoding.
БЛЁЁЁЁЁЁЁ.....
50 килобайт...
Вроде и немного, но откуда?
....
Представляю внутренний монолог его разработчика:
А давай используем для красивостей tweening-компонент (на АС3), который читает, что ему делать, из xml. В котором опишем используемые шрифты, цвет фона, и переходы между "сценами" (текстом и картинкой). А текст на баннере мы будем хранить как html, конечно же в этом же xml, в percent-encoding.
БЛЁЁЁЁЁЁЁ.....
2010-03-10
2010-02-16
Левая рука не знает, что делает правая
Как же я люблю Adobe....
Флекс такое компилит, а Флеш -- нет.
class TheBase extends Object { private function test():void {} } class Derived extends TheBase { private override function test():void {} }
Флекс такое компилит, а Флеш -- нет.
2010-02-09
о ёжиках.
Бьярн Страуструп - "Дизайн и эволюция языка С++" => "Как я родил ёжика"
Андрей Александреску - "Современное проектирвоание на языке С++" => "Как я трахнул ёжика"
(с) zabivator.livejournal.com
UPD:
den: ага, в таком случае "каждый программер должен знать и владеть с++" => "Який ти в чорта лицар, якщо голою сракою їжака не вб`єш?"
Андрей Александреску - "Современное проектирвоание на языке С++" => "Как я трахнул ёжика"
(с) zabivator.livejournal.com
UPD:
den: ага, в таком случае "каждый программер должен знать и владеть с++" => "Який ти в чорта лицар, якщо голою сракою їжака не вб`єш?"
2010-01-29
... утка в зайце, заяц в шоке!..
Отдекомпилил флешевый загрузчик фоток Вконтакта.
Оказалось, что они используют адобовкую Alchemy.
Это такая хрень, что позволяет компилить C/C++ код в байт-код AVM2 (ActionScript 3).
Так вот, в загрузчик фоток вконтакта вкомпилена либа по работе с jpeg (от IJG).
Пережимают фотки...
Гугление показало, что это сделано для ускорения конвертации в JPEG.
Сишный код,скомпиленный в помесь АС3 байткода и х86 (который выполняется на написанном на AC3 интерпретаторе), выполоняется в несколько раз быстрее, чем реализация джипег-энкодера на чистом AC3. Как-то странно это все.
То-ли у алхимии такой хороший эмитер кода, то-ли у флеша/флекса -- плохой.
Оказалось, что они используют адобовкую Alchemy.
Это такая хрень, что позволяет компилить C/C++ код в байт-код AVM2 (ActionScript 3).
Так вот, в загрузчик фоток вконтакта вкомпилена либа по работе с jpeg (от IJG).
Пережимают фотки...
Гугление показало, что это сделано для ускорения конвертации в JPEG.
Сишный код,скомпиленный в помесь АС3 байткода и х86 (который выполняется на написанном на AC3 интерпретаторе), выполоняется в несколько раз быстрее, чем реализация джипег-энкодера на чистом AC3. Как-то странно это все.
То-ли у алхимии такой хороший эмитер кода, то-ли у флеша/флекса -- плохой.
Подписаться на:
Сообщения (Atom)