воскресенье, 19 мая 2013 г.

is_type, dynamic_cast, double dispatch и производительность

Как то раз я встретил реализацию шаблонного класса для хранения объектов разных типов, которая мне не понравилась. Если упростить ситуацию, то этот класс выглядит так:
struct val_base
{
    virtual ~val_base() = 0;
    template<typename T> bool is_type() const;
};
template <typename T> struct val : public val_base
{
    T value_;
};
Класс этот общего назначения и поэтому не представляется возможным определить сразу набор виртуальных функции для операций с его потомками. Поэтому используется функции is_type<T>  и работа с экземпляром класса выглядит таким образом
val_base * v;
...
if(v->is_type<int>())
{
   int val = static_cast<val<int> *>(v)->value_;
...
}
else if(v->is_type<double>())
{
   double val = static_cast<val<double> *>(v)->value_;
...
}
...
Реализована функция is_type<T>  так:
template<typename T> bool val_base::is_type() const 
{
      return dynamic_cast<const val<T>*>(this) != NULL;
}
Мне это не понравилось, так как были подозрения что эта реализация имеет серьёзные проблемы с производительностью. Во первых производятся множественные вызовы функции  is_type, во-вторых использование dynamic_cast  даже в этом простейшем случае может быть довольно накладным. Кроме того есть и другие причины не любить такой метод использования этого класса - довольно сложно сопровождать это решение в случае расширения списка хранимых типов, да и это просто некрасиво. Дальнейший текст посвящен измерению производительности различных методов работы с этим классом. Забегая вперед - метод работы, использующий is_type<T> реализованный с помощью  dynamic_cast, действительно самый медленный, более быстрые методы могут работать в 10 раз быстрее.  

воскресенье, 17 февраля 2013 г.

tortoise SVN и русский spell check

Типичная ситуация - делаешь коммит в tortoise SVN и в описании допускаешь какую-нибудь описку, АпшиПку и это остается навсегда. Что очень неприятно - твоя ошибка оказалась выбитой в камне. Tortoise SVN я использую с английским языком, а описания пишу по-русски. Стал искать как установить проверку орфографии русского языка в  tortoise SVN.  Обнаружилась замечательная вещь - надо оказывается просто скачать и установить русский языковый пакет и проверка орфографии для русского языка автоматически появится. Сам же tortoise SVN можно оставить  работающим на английском языке. Скачивается языковый пакет из стандартной страницы загрузки. 

четверг, 31 января 2013 г.

TortoiseSVN и Id

И на работе и дома в качестве системы контроля версия я использую SVN. В качестве клиента выступает TortoiseSVN, который обеспечивает  интеграцию с Windows и в частности с моим любимым файловым менеджером Total Commander.  В свойствах файла с исходным кодом, который помещается в SVN, можно установить ключевое слово svn:keywords=Id

вторник, 29 января 2013 г.

Думай, когда используешь готовые формулы

Подходит ко мне коллега и говорит: "У меня почему-то шум в данных, вычисленных мной, раз в 10 больше чем в оригинальных данных от прибора. Наверное, в приборе используется какое-то хитрое сглаживание, так как обычное усреднение не помогает. Не знаешь, что здесь можно применить?"
Пошли, посмотрели. Выглядело это примерно так:

Вверху - сигнал с прибора. Внизу, красный - расчетный сигнал, черный - сглаживание скользящим усреднением  с длиной фильтра в 7 точек
Шум действительно большой. На какое-то хитрое сглаживание совершенно не похоже. Что бы такое сгладить надо сглаживать по несколько десяткам точкам. Надо искать в чем дело. На рисунке простейшее скользящее усреднение по 7 точкам.
Ну что же надо разбираться.