четверг, февраля 28, 2008

5 инструментов

Супруг подключил меня к эстафете "5 инструментов без которых я не могу работать продуктивно", отмазаться не получится.

1. Far Manager
Это не двухоконное старьё! Это винтажный файл-менеджер :-). Под него можно писать плагины. Надо будет, кстати, найти какой-нибудь плагин для редактирования бинарников.
Командная строка еще в нем есть - удобно...
Недавно были открыты его исходники, кстати.

2. Visual Studio
Не могу сказать, что интерфейс у Visual Studio особенно удобный, но пользуюсь ей постоянно. Версию не пишу, потому что использую разные версии.

3. FireFox
Отличный браузер.



4. Notepad
Простой и удобный текстовый редактор.

5. Paint
Когда надо нарисовать тестовую текстуру, когда надо попиксельно разглядеть скриншот, я запускаю Paint. Стартует он быстро, интерфейс - проще некуда. Если бы он умел еще с прозрачностью работать и с .ico - цены бы ему не было. Художники надо мной глумятся и советуют изучить Фотошоп.

Ну и о ком еще интересно узнать
Not a kernel guy - 5 инструментов
Yuriy Volkov - 5 инструментов
Евгений Зуев - 5 инструментов, без которых я не могу работать продуктивно
Alex Ott - он, правда, и так довольно часто пишет про всякие тулзы - Подхватывая эстафету :-)
lrrr - Мои пять инструментов

пятница, февраля 22, 2008

Статья Open Multi-Methods for C++

Open Multi-Methods for C++ - предложение по реализации мультиметодов в С++. Один из авторов предложения - Страуструп. В новый стандрат это предложение войдет вряд ли, а вот в качестве расширений языка к каким-нибудь компиляторам вполне может появиться.

Открытые мультиметоды работают со множественным и виртуальным наследованием, не мешают исключениям, не увеличивают накладные расходы на вызов обычных виртуальных функций.

Авторы реализовали это предложение в компиляторе EDG с помощью таблиц открытых мультиметодов. Традиционная таблица виртуальных функций, v-table, у них содержит ссылку на еще одну таблицу- om-table. Еще в статье предлагается сделать это через какие-то Chinese Remainders. Но потом они пишут, что подход этот сложный, очень уже теоретичный и плохо будет работать с большими иерархиями.

По ходу дела рассматриваются существующие реализации мультиметодов. С помощью препроцессора реализуют мультиметоды в Cmm и DoubleCpp. С помощью темплейтов - Loki.

В конце статьи приводится сравнение этой реализации с другими реализациями мультиметодов.


Approach Size (bytes) Cycles/Loop Cycles/Loop
Linux Pentium-D Core2Duo
Virtual function n/a 75 55
C++ Multi-method 19 547 78 60
C++ Open-method 19 725 82 63
EDG/Omm 70 647 82 64
Double Cpp 20 859 120 82
C++ Visitor 35 289 132 82
Chinese Remainders n/a 175 103
Cmm (constant time) 112 250 415 239
Cmm 111 305 1 320 772
Loki Library 34 908 3 670 2 238


Размер тут указан, но я так и не поняла зачем. В статье говорится, что к одним какие-то библиотеки прилинковывались, к другим нет... Ни о чем не говорит этот размер, короче. А вот со скоростью интереснее. Получается, что реализация в Loki очень тормозная по сравнению с остальными.

По ссылке с Lambda the Ultimate

Ссылки по теме:
Мультиметоды

воскресенье, февраля 17, 2008

Статья How To Go Slow

How To Go Slow - список типичных ошибок программистов, которые приводят к тормозным программам. Никаких откровений, просто очень приятная подборка.

...My experience has long been that my new computers keep getting exponentially more powerful, thanks to Moore's Imperative, but many of my new programs don't get any faster at all, and some are unbelievably slow. Molasses-in-January slow. Sedated-sloth slow. Anesthesized-slug slow.

So how do we manage to waste such abundant resources? We have our ways...

воскресенье, февраля 10, 2008

RVO и NRVO

Тема RVO была затронута zorgg'ом в одном из комментариев, я решила написать про нее подробнее.

RVO расшифровывается как return value optimization, оптимизация возвращаемого значения. В случае такого вот кода:


std::string foo()
{
return std::string('a',1000000);
}


компилятор может не создавать временный объект и сразу же создать строку в возвращаемом объекте. Это старая оптимизация, Скотт Мейерс рассказывает о ней в Правиле 20 второй своей "эффективной" книги. Он особенно напирает на то, что эта оптимизация удобна при переопределении операторов.

Кроме RVO есть еще NRVO, она поновее, ее сложнее было реализовать в компиляторах. NRVO расшифровывается как named return value optimization, оптимизация именованного возращаемого значения. NRVO применяется в случаях чуть отличных от предыдущего.

std::string foo()
{
std::string a('a',1000000);
return a;
}

Тут Стандарт позволяет компилятору не создавать локальный объект, хотя не требует такого поведения (12.8/15).

При NRVO не просто не происходит вызова конструктора копирования, здесь даже не будет побитового присваивания.

Про NRVO есть хорошая статья на MSDN, где рассказывается как NRVO работает, когда не работает, почему при применении NRVO у компилятора могут появиться проблемы. В статье рассматривается компилятор Visual C++ 2005, но все компиляторы будут делать примерно то же самое. Хороший пример оттуда.
Есть такая функция:

A MyMethod (B &var)
{
A retVal;
retVal.member = var.value + bar(var);
return retVal;
}


Которая вызывается где-то вот таким образом

valA = MyMethod(valB);


Псевдокод, который подробнее рассказывает о том, что будет происходить в функции без NRVO.

A MyMethod (A &_hiddenArg, B &var)
{
A retVal;
retVal.A::A(); // constructor for retVal
retVal.member = var.value + bar(var);
_hiddenArg.A::A(retVal); // the copy constructor for A
return;
retVal.A::~A(); // destructor for retVal
}

А вот с NRVO все происходит несколько быстрее, потому что локальная переменная retVal вообще выбрасывается

A MyMethod(A &_hiddenArg, B &var)
{
_hiddenArg.A::A();
_hiddenArg.member = var.value + bar(var);
Return
}

NRVO можно применить не всегда, в этой MSDN'овской статье рассматриваются случаи, когда при ветвлениях в функции возвращаются разные значения, еще возможны проблемы при работе с исключениями и с ассемблерными вставками.

Чтобы проверить, есть ли в компиляторе NRVO, можно воспользоваться вот таким кусочком кода из блога Стенли Липпмана.

#include <iostream>

using namespace std;

class foo {
public:

foo() { cout <<"foo::foo()\n"; }
foo( const foo& ){ cout << "foo::foo( const foo& )\n"; }
~foo(){ cout << "foo::~foo()\n"; }
};

foo bar(){ foo local_foo; return local_foo; }

int main()
{
foo f = bar();
}

Если при запуске выдалось вот такое, то NRVO не отработало.

foo::foo()
foo::foo( const foo& )
foo::~foo()
foo::~foo()


Возможно, надо поиграть с найстройками оптимизации, а, возможно, компилятор вовсе не умеет NRVO.

Важный момент, который всегда упоминается при обсуждении этих оптимизаций. При их использовании могут возникнуть проблемы, если определенный вами конструктор копирования делает не только копирование.

Ссылки по теме:
Named Return Value Optimization in Visual C++ 2005
comp.lang.c++.moderated - RVO
comp.lang.c++.moderated - Return value optimization
comp.lang.c++.moderated - Return Value Optimization
Несмотря на то, что последние две ссылки называются одинаково, это разные обсуждения

понедельник, февраля 04, 2008

Посты об Эрланге на Блоге Тру Программиста

lrrr на своем блоге начал серию постов про Эрланг. Пока написал три штуки.

Crash Course: веб приложения на Erlang [Дисклеймер]
Синтаксис Erlang в двух словах
Erlang: распределенные приложения

Судя по тому, что Блог Тру Программиста последние несколько дней является моим топ реферером, посты пользуются успехом.