Ненавижу 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)
