среда, 11 февраля 2015 г.

HowTo // Как строить Apache Thrift // part 2

Обновление к предыдущей статье.

Не прошло и полгода, как  коллеги из Siemens проникшись преимуществами CMake и добавили его таки в Apache Thrift. Причем похоже у них большие планы по полной замене automake в версии 1.0.0 и есть возможность (видимо их большинство в Apache Thrift project team).

Кое что взяли из моего, теперь уже бесспорно, заброшенного проекта.

Поддержка уже в ветке master.

пятница, 7 февраля 2014 г.

HowTo // Как строить Apache Thrift в Visual Studio

Доброго времени суток!

Прелюдия (не очень полезная информация)

Возник интерес по сборке и использованию Apache Thrift (в прошлом проект Facebook-а) у себя в продукте на Windows.

У Apache все работают на Mac/Linux и индейцев проблемы остального населения не беспокоят. Хотя, надо признать, в последние версии "пролезли" обрезанные проекты от Visual Studio для компилятора и библиотеки - земной поклон.

Мы же по простому крестьянски в Windows мастерим (иногда из любви к кросс платформенности проверяя MinGW/Cygwin или в виртуалочке на распоследней Fedora с clang).

И так мне не любо, когда необходимо читать README_WINDOWS.txt с какими-то инструкциями, что нужно вручную что-то скопировать, что-то переименовать и что-то прописать в переменные окружения. Да так, что руки невольно начинают "ерзать" по клавиатуре и описывать проект в CMake (простите за мою слабость к данному инструменту).

Так как "индейские" ребята из племени Апачей (как и Гуглоидов), походу, ненавидят CMake, о чем они демонстративно заявили, накорню убив в Июне 10-го интергацию какого-то залетного "перца" и его надежду в светлое будущее кросс платформенного генератора билдов. Поэтому, подавать это в "индейское" племя (Jira то бишь) видимо смысла нет.

Ну так вот... Подсмотрев идею не интрузивного (или не инвазивного???) проекта для Google Protobuf накидал похожее для ApacheThrift о чем спешу поделиться - может кому тоже подойдет.

HowTo (полезная информация)

Зависимости

CMake (у меня 2.8.12)
Git
Какой нибудь компилятор C++ (у меня основная платформа msvc++ 11 (vs2012))
Flex/Bison
Boost C++ (1.55 использую собранный, тем компилятором что выбрали выше)
Клонируете исходный код Thrift (можно официальный, можно зеркало)
Клонируете мой проект (fork me on github)

запустить из командной строки

cmake <путь к моему проекту> -DTHRIFT_SRC_ROOT=<путь до клона thrift>
если стандартный генератор не люб - добавте -G<имя генератора> (я например фэн Ninja)

Дополнительные опции (вроде понятные)

Обязательные (если cmake не найдет сам, по любому придется указать - зависимость)
  • -DBOOST_ROOT=<путь до Boost C++ Library>

Необязательные (без них будет строиться, но пропадут фичи упаковки и криптования)
  • -DWITH_TESTS=ON
  • -DZLIB_ROOT=<путь до ZLib>
  • -DOPENSSL_ROOT_DIR=<путь до OpenSSL>

Может заработать не сразу - штука экспериментальная.
Патчи и проблемные репорты приветствуются, хотя не обещаю скорого исправления :)
Пока в планах - добавление Libevent для асинхронных сервера и клиента и инсталляция.
Далее - как пойдет.

Удачи.
----------
If you build it, CR will come... (старая Motorola-вская шутка)

среда, 19 декабря 2012 г.

Brainbench замерки.

Случайно зашел в прошлом году на Brainbench и по дешевке (что-то около 10 долларов) купил безлимитную подписку. Было бы дороже, не купил бы по причине банальной жадности.

Время выходит, деньги пропадают, посему решил замерить скиллы.

Вроде получилось, хотя последний дался тяжелее  :)



Осталось до конца января 2013 еще осилить замер по C++.

Детали в транскрипте Transcript ID#: 7395311

среда, 7 декабря 2011 г.

git+ssh через https прокси

В продолжение предидущей темы о работе git из-за прокси.

Собственно, предидущая тема рассчитана на взятие и обновления исходного кода из репозитория (git clone/pull). Отдачу дельты она не подразумевает (git push).
Однако в жизни разработчика наступает момент, когда необходимо что-либо поместить на сервер.

В моем случае это была конфигурация редактора emacs на github. При изпользозании одного редактора и на работе и дома хочеться иметь общую конфигурацию. Конфигурацию, обычно меняешь по ходу работы и нужно удачный вариант сохранить для дальнейшего использования.


И тут на помощь нам приходит corkscrew. На Fedora она есть в репозиториях.

  1. Устанавливаем corkscrew (yum install corkscrew)
  2. Добавляем в $HOME/.ssh/config следующие строчки
Host github.com
    User git
    HostName ssh.github.com
    Port 443
    ProxyCommand corkscrew 127.0.0.1 9090 %h %p


У меня используется cntlm прокси, поэтому адрес 127.0.0.1 и порт 9090. Если у кого не так, нужно заменить эти значения на те, которые используются в вашей сети.

Теперь git push должен работать из-за прокси.
Если нужен другой сервер с ssh (не github.com), его также нужно добавить в $HOME/.ssh/config


.

среда, 6 октября 2010 г.

Цитата от Стива (перепост)

Не имеет смысла нанимать толковых людей, а затем указывать, что им делать. Мы нанимаем толковых людей, чтобы они говорили, что делать нам.

Взято отсюда

четверг, 9 сентября 2010 г.

Основные принципы Pixar

Гуглил я тут недавно и наткнулся на статью в SHR Consulting про Pixar - секрет фантастического успеха Стива Джобса.

Надо сказать, что довольно простые и правильные принципы. Многим компаниям имеет смысл перенять их.

Не могу не привести их у себя

Принципы успешности Pixar
  1. Всегда учиться: команда Pixar постоянно задает себе вопросы: «почему» и «что если ..?», что приводит к замечательным открытиям.
  2. Поиск правильных партнеров: Pixar работает с компанией Disney, Томом Хенксом, Стивом Джобсом, Тимом Алленом и многими другими. Правильные партнеры помогут оптимизировать эффективность и раскроют потенциал.
  3. Командность: хорошие команды состоят из хороших элементов, в команде много задач важнее собственных желаний. Команда Pixar оставалась командой даже в не самые светлые свои дни.
  4. Человеческий капитал: Pixar дисциплинированно воспитывали и растили лучших из лучших, они инвестировали в блестящих людей. Человеческий капитал это не затраты – это инвестиции.
  5. Доверие интуиции: история Pixar полна моментов, когда логика бизнеса говорила "нет" творческой интуиции (например, 3D анимация по сравнению с 2D), но они воплощали в жизнь идеи и добивались оглушительного успеха.
  6. Вера в успех: эта вера позволила компании работать в течение очень трудных лет.
  7. Талант: Только талантливо рассказанные и показанные истории становятся бестселлерами.
  8. Работа - это праздник: команда Pixar отмечает как праздник маленькие технические победы в течение работы.
  9. Упорство: Pixar потребовались десять долгих лет, чтобы добиться успеха, в течение которых компания перепродавалась, теряла миллионы долларов.

среда, 8 сентября 2010 г.

туннельный синдром

Прочитал историю о туннельном синдроме. Ведь работаю с клавиатурой. Правда с Dvorak раскладкой. Иногда подолгу и на ноутбуке. И emacs использую. И колесо мышки кручу. Стало немного неуютно...

Потом прочел комментарии от Евгения Охотникова и успокоился. Честно признаюсь - ну не даю я 1 КLOC в рабочий день. А если бы и давал, то как в анекдоте - такая бы фигня получалась.

Берегите себя и свои пальцы/кисти.

четверг, 6 мая 2010 г.

Кто такие консерваторы?

В фоне говорит телевизор.
В Великобритании предвыборная гонка...
Консерваторы против лейбористов...
Лидер консерваторов посещает детские сады и объясняет детям, кто такие консерваторы и почему они лучше лейбористов...

Спрашиваю жену:
- Дорогая, а кто такие консерваторы?
Старший сын (3 года и 2 месяца) ковыряясь в своих игрушках не глядя говорит:
- Я знаю, кто такие консерваторы. Это те кто открывает банки!

...

Мы с женой ничего не могли говорить минут 15 :)))))

четверг, 18 февраля 2010 г.

Как использовать git из за HTTP прокси с Linux машины

Оригинал статьи на Английском здесь

Собственно суть проблемы.

Все началось с того что я решил вытянуть на работе boost-cmake с gitorious, но так как там большие блобы, то клонирование по http:// протоколу через корпаративный прокси заканчивалось ошибкой 500, где-нибудь в районе 25-30%. Описание проблемы, похоже на приведенное здесь.

Утверждалось, что по git:// схеме такого быть не должно.

1. Собственно предложенный вариант - туннель git протокола через HTTP CONNECT. Данная схема используется для https:// соединений на порт 443. Так как все корпаративные прокси поддерживают данную возможность, то необходимо попросить админа разрешить метод HTTP CONNECT на порт 9418, который используется git.

2. Далее нужна утилита socat - устанавливаем ее со своего Linux репозитория (yum install socat).

3. Создайте исполняемый скрипт с именем gitproxy (или выберите имя на ваше усмотрение) где-нибудь в месте из переменной PATH (например ~/bin):

#!/bin/sh
# Use socat to proxy git through an HTTP CONNECT firewall.
# Useful if you are trying to clone git:// from inside a company.
# Requires that the proxy allows CONNECT to port 9418.
#
# Save this file as gitproxy somewhere in your path (e.g., ~/bin) and then run
# chmod +x gitproxy
# git config --global core.gitproxy gitproxy
#
# More details at http://tinyurl.com/8xvpny
# Configuration. Common proxy ports are 3128, 8123, 8000.
_proxy=proxy.yourcompany.com
_proxyport=3128
exec socat STDIO PROXY:$_proxy:$1:$2,proxyport=$_proxyport

4. Конфигурируем git на использование данного скрипта (git config --global core.gitproxy gitproxy или имя выбранное вами на шаге 3)

Собственно и все. Теперь git:// URL-ы тоже работают.

Оказалось, действительно, на данном протоколе все работает стабильнее।

Обновил:
- 04.02.2011 - исправил досадную опечатку в пункте 4 (спасибо Yalexand)

воскресенье, 14 февраля 2010 г.

Зимняя олимпиада 2010 // трагедия на санной трассе

Прочитал новость о трагедии Кумариташвили и посмотрел видео.

Следующая тема о том де, что он сам виноват.

После таких новостей - поганенько на душе. Лично я считаю, что тут явно виноват оргкомитет и тот, кто принимал трассу. Ошибка спортсмена не должна приносить такие последствия. И обесечить безопасность - основная задача олимпийских чиновников.

На повороте должна была быть установлена уловительная сетка, поскольку на таких скоростях даже у опытных спортсменов могли быть ошибки. И это не значит что они должны так глупо погибать.

Соболезнования родным и близким атлета.

четверг, 4 февраля 2010 г.

открыли исходники Symbian

Пока Google бодается с Apple появилась еще одна открытая платформа - Symbian. Время покажет, будет ли из этого прок, и станет ли Symbian привлекательной платформой для производителей телефонов.

Ну а пока можно ознокомиться с исходными кодами некогда закрытой мобильной платформы здесь.

среда, 3 февраля 2010 г.

Стив Джобс о Google...

В связи с участившимся сравнением Apple iPhone vs Google Android знаменательно следующее высказывание Стива
Мы не открывали поисковый сервис, но они вошли в телефонный бизнес. Будьте уверены, что их целью является уничтожение iPhone. Мы не позволим этому случиться

Вышел "новый" Boost

1 новая библиотека и некоторое количество исправленных проблем...

New Libraries

  • Uuid: A universally unique identifier, from Andy Tompkins.

Updated Libraries

  • Asio:
    • Added a new HTTP Server 4 example illustrating the use of stackless coroutines with Asio.
    • Changed handler allocation and invocation to use boost::addressof to get the address of handler objects, rather than applying operator& directly (#2977).
    • Restricted MSVC buffer debugging workaround to 2008, as it causes a crash with 2010 beta 2 (#3796, #3822).
    • Fixed a problem with the lifetime of handler memory, where Windows needs the OVERLAPPEDstructure to be valid until both the initiating function call has returned and the completion packet has been delivered.
    • Don't block signals while performing system calls, but instead restart the calls if they are interrupted.
    • Documented the guarantee made by strand objects with respect to order of handler invocation.
    • Changed strands to use a pool of implementations, to make copying of strands cheaper.
    • Ensured that kqueue support is enabled for BSD platforms (#3626).
    • Added a boost_ prefix to the extern "C" thread entry point function (#3809).
    • In getaddrinfo emulation, only check the socket type (SOCK_STREAM or SOCK_DGRAM) if a service name has been specified. This should allow the emulation to work with raw sockets.
    • Added a workaround for some broken Windows firewalls that make a socket appear bound to 0.0.0.0 when it is in fact bound to 127.0.0.1.
    • Applied a fix for reported excessive CPU usage under Solaris (#3670).
    • Added some support for platforms that use older compilers such as g++ 2.95 (#3743).
  • Circular Buffer:
    • Added methods erase_begin(size_type) and erase_end(size_type) with constant complexity for such types of stored elements which do not need an explicit destruction e.g. int or double.
    • Similarly changed implementation of the clear() method and the destructor so their complexity is now constant for such types of stored elements which do not require an explicit destruction (the complexity for other types remains linear).
  • Fusion:
    • The accumulator is the first argument to the functor of fusion::fold and fusion::accumulate(#2355).
    • Added support for associative iterators and views (#3473).
  • Graph:
    • Removed old interface to compressed_sparse_row_graph, making new interface the default.
  • Integer:
    • Reverted Trunk to release branch state (i.e. a "known good state").
    • Fixed issues: 653, 3084, 3177, 3180, 3568, 3657, 2134.
    • Added long long support to boost::static_log2, boost::static_signed_min,boost::static_signed_max, boost::static_unsigned_minboost::static_unsigned_max, when available.
    • The argument type and the result type of boost::static_signed_min etc are now typedef'd. Formerly, they were hardcoded as unsigned long and int respectively. Please, use the provided typedefs in new code (and update old code as soon as possible).
  • Iostreams:
  • Program.Options:
    • Information about option name added to a few exception classes and various clean ups in exception classes (#3423).
    • Description wordwrapping in presense of default parameters fixed (#2613).
    • Empty value in configuration file is now permitted (#1537).
    • Quotes are no longer stripped from string values (#850).
    • Fix endless loop in case of long default arguments (#689).
    • Fix compile warning caused by usage of boost::any (#2562).
    • Fix memory bug in example/response_file.cpp (#3525).
    • Most compilation warnings were fixed (#3608).
    • Make column width for description text configurable. (#3703).
    • Add general split function: split_unix() (#2561).
    • Enable open config files from given file name (#3264).
    • Additional flag for required options (#2982).
    • Enable case insensitive style for command line (#3498).
  • PropertyMap:
    • Removed old header files (directly in the boost/ directory); they were deprecated since 1.40, replaced by headers in boost/property_map/.
  • Proto:
    • Fix const correctness issues with proto::flatten and friends (#3364).
    • Accomodate recent change to fusion::fold, remove old support for Doxygen and pre-1.35 Fusion (#3553).
    • In binary operations, when one operand has a user-specified domain and the other has the default domain, the user-specified domain trumps.
    • Fix BOOST_PROTO_EXTENDS to work with elaborated types.
    • Work around EDG compiler bug with function types and cv-qualification.
  • Regex:
    • Added support for Functors rather than strings as format expressions.
    • Improved error reporting when throwing exceptions to include better more relevant information.
    • Improved performance and reduced stack usage of recursive expressions.
    • Fixed tickets #2802, #3425, #3507, #3546, #3631, #3632, #3715, #3718, #3763, #3764
  • Spirit: Spirit V2.2, see the 'What's New' section for details.
  • Unordered:
    • Support instantiating the containers with incomplete value types.
    • Add erase_return_void as a temporary workaround for the current erase which can be inefficient because it has to find the next element to return an iterator (#3693).
    • Add templated find overload for compatible keys.
    • Improved codegear compatibility.
    • Other minor changes, full details in the changelog.
  • Xpressive:
    • match_results no longer relies on undefined behavior in std::list (#3278).
    • Do NOT copy singular iterators (#3538).
    • Eliminate gcc and darwin warnings (#3734).


среда, 18 ноября 2009 г.

RedHat Fedora 12 is out

Как-то незаметно в День моего Рождения выпустили 11.2 OpenSuse.
Досадно, что я к этому времени уже полностью перешел на Fedora... И она обновилась сегодня до 12 версии!

Брать можно здесь

--
Best Regards,
Sergey Nikulov

среда, 11 ноября 2009 г.

New system language from Google

Google разошелся... В этом году объявил уже о втором новом языке придуманном ими.
Язык назвали Go. Я бы на их месте назвал его Goo :-)
Результат скрещивания C++ и Python.

вторник, 22 сентября 2009 г.

Continuous integration

Случилось так что потрабовалось для проекта подобрать сервер для Continuous integration.

Решил вначале опробовать CruiseControl. Все таки Мартин Фаулер вроде приложил руку к его созданию.

Конфигурационный инструмент, который должен был запуститься со странички через Java WebStart, на Linux-е запускаться и не подумал.

После 2х часов RTFM-а, грубо ругаясь, прекратил тщетные попытки описать проект для C++/CMake/SVN и, успокаивая себя тем что это же OSS, и не надеясь ни на что хорошее бросил Hudson-овский war в папку приложений Tomcat.

Используя Hudson web-интерфейс за пару минут создал два проекта которые проверяют SCM на наличие изменений, запускают билд, если изменения есть, высылает сообщение по почте и результат публикуют на FTP.

Ну а после того как обнаружил в списке дополнений слова cmake & scons... Я фанат Hudson-а!

Надо сказать, что я никому не посоветую CruiseControl.

вторник, 9 июня 2009 г.

про интернет в Калифорнии (продолжение...)

Сегодня прихожу на рабочее место - смотрю какой-то мужичек возле моего ноута крутиться.
- Вотс гоин он? говорю.
Он отвечает на чистейшем американском - а это ваш компьютер?
- Мой - говорю.
- А вы ничего большого не качали? - спрашивает он, видимо в надежде на отмазки.
- Качал говорю - не далее как в конце прошлой недели - 8 Гб за вечер утянул в торрентах с сайта Fedoraproject.org
- Ну вообщем-то говорит не большая проблема, просто вы канал нам просадили на прошлой недели в усмерть - никто работать не мог. Я - говорит - грешным делом на порновирус рассчитывал - а тут вы со своим Линуксом.
- Да - говорю я, не извиняясь - херня такая этот Линукс - говорю смотри - апдэйтов кажет 686 штук и показал значек ПэкаджКита. Хотя - говорю - на прошлой неделе не менее после установки вытянул...
- А ограничить по полосе его нельзя?
- Да можно, тока я думал у вас в Америке с пропускной способностью каналов проблем нет, начал я испорченный Иллинойсовским безлимитом на комкасте....
- Не делайте так больше - сказал мужик и ушел...

Вот такая вот поучительная история...
Походу тут каналы в Силиконке нифига не широкие...
И "палят" на них реально...

C++ для встроенного ПО

Читаю статью на Руководство по С++ для осмотрительного программера встроенных систем на embedded.com.

Прежде всего, хочеться отметить, что мне понравился сайт, как ресурс. Я давно на него поглядывал, но все не находил времени почитать. Интересные советы, статьи. Нельзя сказать, что все новое и незнакомое - где-то слышал то, где-то это...

Вообщем, иногда имеет смысл поглядывать, и не забывать.

Решил немного посчитать и поэкспериментировать.

Написал маленький и смешной кусок кода:

int main(int argc, char * argv[])
{
return 0;
}


скопировал текст в два файла:
try_me.c
try_me.cpp

собрал "в лоб" по простому...

[snikulov@solarwind c_vs_cpp]$ gcc try_me.c -o try_c
[snikulov@solarwind c_vs_cpp]$ g++ try_me.cpp -o try_cpp
[snikulov@solarwind c_vs_cpp]$ ls -la
total 32
drwxrwxr-x. 2 snikulov snikulov 4096 2009-06-08 23:28 .
drwxrwxr-x. 6 snikulov snikulov 4096 2009-06-08 22:41 ..
-rwxrwxr-x. 1 snikulov snikulov 4728 2009-06-08 23:27 try_c
-rwxrwxr-x. 1 snikulov snikulov 5047 2009-06-08 23:27 try_cpp
-rw-rw-r--. 1 snikulov snikulov 55 2009-06-08 22:43 try_me.c
-rw-rw-r--. 1 snikulov snikulov 55 2009-06-08 22:43 try_me.cpp
[snikulov@solarwind c_vs_cpp]$

Ну что тут сказать - 4728 vs. 5047

Вообщем C++ вариант больше на 300 байт просто без всего.

Играемся с опциями компилятора (пока по размеру -Os):

[snikulov@solarwind c_vs_cpp]$ g++ try_me.cpp -Os -o try_cpp
[snikulov@solarwind c_vs_cpp]$ gcc try_me.c -Os -o try_c
[snikulov@solarwind c_vs_cpp]$ ls -la
total 32
drwxrwxr-x. 2 snikulov snikulov 4096 2009-06-08 23:33 .
drwxrwxr-x. 6 snikulov snikulov 4096 2009-06-08 22:41 ..
-rwxrwxr-x. 1 snikulov snikulov 4728 2009-06-08 23:33 try_c
-rwxrwxr-x. 1 snikulov snikulov 5047 2009-06-08 23:33 try_cpp
-rw-rw-r--. 1 snikulov snikulov 55 2009-06-08 22:43 try_me.c
-rw-rw-r--. 1 snikulov snikulov 55 2009-06-08 22:43 try_me.cpp
[snikulov@solarwind c_vs_cpp]$

Эффекта не замечаем - предполагаю что компилер оптимизирует (означает что оптимизировать там нечего ;-) )

Ок. Переходим к отключению фич языка C++ - это должно быть интереснее, ибо размером больше (наверное за счет них)

Первая - RTTI

[snikulov@solarwind c_vs_cpp]$ gcc try_me.c -o try_c
[snikulov@solarwind c_vs_cpp]$ g++ try_me.cpp -fno-rtti -o try_cpp
[snikulov@solarwind c_vs_cpp]$ ls -la
total 32
drwxrwxr-x. 2 snikulov snikulov 4096 2009-06-08 23:38 .
drwxrwxr-x. 6 snikulov snikulov 4096 2009-06-08 22:41 ..
-rwxrwxr-x. 1 snikulov snikulov 4728 2009-06-08 23:38 try_c
-rwxrwxr-x. 1 snikulov snikulov 5047 2009-06-08 23:38 try_cpp
-rw-rw-r--. 1 snikulov snikulov 55 2009-06-08 22:43 try_me.c
-rw-rw-r--. 1 snikulov snikulov 55 2009-06-08 22:43 try_me.cpp

Никакго эффекта. Угу.

Переходим к другой фиче - исключения

[snikulov@solarwind c_vs_cpp]$ g++ try_me.cpp -fno-exceptions -o try_cpp
[snikulov@solarwind c_vs_cpp]$ ls -la
total 32
drwxrwxr-x. 2 snikulov snikulov 4096 2009-06-08 23:39 .
drwxrwxr-x. 6 snikulov snikulov 4096 2009-06-08 22:41 ..
-rwxrwxr-x. 1 snikulov snikulov 4728 2009-06-08 23:38 try_c
-rwxrwxr-x. 1 snikulov snikulov 4818 2009-06-08 23:39 try_cpp
-rw-rw-r--. 1 snikulov snikulov 55 2009-06-08 22:43 try_me.c
-rw-rw-r--. 1 snikulov snikulov 55 2009-06-08 22:43 try_me.cpp
[snikulov@solarwind c_vs_cpp]$

Уже лучше
4728 vs. 4818

Что же там такое - смотрим (я взял опцию -d ибо по остальному большого различия не увидел... хотя я конечно лукавлю - сами посмотрите)

[snikulov@solarwind c_vs_cpp]$ readelf -d try_c

Dynamic section at offset 0x4ec contains 20 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0x8048274
-= skip =-
[snikulov@solarwind c_vs_cpp]$ readelf -d try_cpp

Dynamic section at offset 0x52c contains 23 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0x80482c0
-= skip =-
snikulov@solarwind c_vs_cpp]$

Ну... Вообще бардак

Полагаем и время выполнения из-за этого должно немного проседать.
Проверяем (используем не совсем точный метод расчета):

[snikulov@solarwind c_vs_cpp]$ time ./try_c

real 0m0.002s
user 0m0.000s
sys 0m0.001s
[snikulov@solarwind c_vs_cpp]$ time ./try_cpp

real 0m0.005s
user 0m0.001s
sys 0m0.002s
[snikulov@solarwind c_vs_cpp]$


Ну приблизительно. А почему? Ну, как нетрудно догадаться, видимо из-за библиотек?
Проверим

[snikulov@solarwind c_vs_cpp]$ strace ./try_c
execve("./try_c", ["./try_c"], [/* 53 vars */]) = 0
brk(0) = 0x98aa000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=137461, ...}) = 0
mmap2(NULL, 137461, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f6f000
close(3) = 0
open("/lib/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300\253\227\0004\0\0\0\304"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1803388, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f6e000
mmap2(0x964000, 1513768, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x964000
mprotect(0xacf000, 4096, PROT_NONE) = 0
mmap2(0xad0000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16b) = 0xad0000
mmap2(0xad3000, 10536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xad3000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f6d000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7f6d6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xad0000, 8192, PROT_READ) = 0
mprotect(0x960000, 4096, PROT_READ) = 0
munmap(0xb7f6f000, 137461) = 0
exit_group(0) = ?

C++ версия должна быть "пожирнее"

[snikulov@solarwind c_vs_cpp]$ strace ./try_cpp
execve("./try_cpp", ["./try_cpp"], [/* 53 vars */]) = 0
brk(0) = 0x9e42000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=137461, ...}) = 0
mmap2(NULL, 137461, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb8097000
close(3) = 0
open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\3523\0004\0\0\0\360"..., 512) = 512
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb8096000
fstat64(3, {st_mode=S_IFREG|0755, st_size=950040, ...}) = 0
mmap2(0x2fa000, 977644, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2fa000
mmap2(0x3dd000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe2) = 0x3dd000
mmap2(0x3e3000, 23276, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3e3000
close(3) = 0
open("/lib/libm.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`$\256\0004\0\0\0<"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=206204, ...}) = 0 mmap2(0xadf000, 159872, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xadf000 mmap2(0xb05000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25) = 0xb05000 close(3) = 0 open("/lib/libgcc_s.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@O&\0004\0\0\0P"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=172840, ...}) = 0 mmap2(0x263000, 174312, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x263000 mmap2(0x28d000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x29) = 0x28d000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300\253\227\0004\0\0\0\304"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1803388, ...}) = 0 mmap2(0x964000, 1513768, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x964000 mprotect(0xacf000, 4096, PROT_NONE) = 0 mmap2(0xad0000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16b) = 0xad0000 mmap2(0xad3000, 10536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xad3000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb8095000 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb8094000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb8095b20, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xad0000, 8192, PROT_READ) = 0
mprotect(0xb05000, 4096, PROT_READ) = 0
mprotect(0x3dd000, 16384, PROT_READ) = 0
mprotect(0x960000, 4096, PROT_READ) = 0
munmap(0xb8097000, 137461) = 0
exit_group(0) = ?
[snikulov@solarwind c_vs_cpp]$

Ну вообщем понятно...
Оптимизировать непросто. Тут всегда балансируешь на гранях. Когда-то приходит время выбирать. Или быстро и красиво запрограммировать (конструкторы, деструкторы, перегрузки, и т.д.), или уместить все это в железку, чтобы приемлемо работало.

Пошел искать опцию как отключить libm из зависимостей.
-Wl,-nostdlib не помогло.

P.S.
В рассылке по Embedded Linux Developers Kit мужик задал вопрос - а кто-нибудь перл собирал для ресурсо-ограниченного оборудования?
Видимо не очень ограничен, если спрашивает.