Случилось так что потрабовалось для проекта подобрать сервер для Continuous integration.
Решил вначале опробовать CruiseControl. Все таки Мартин Фаулер вроде приложил руку к его созданию.
Конфигурационный инструмент, который должен был запуститься со странички через Java WebStart, на Linux-е запускаться и не подумал.
После 2х часов RTFM-а, грубо ругаясь, прекратил тщетные попытки описать проект для C++/CMake/SVN и, успокаивая себя тем что это же OSS, и не надеясь ни на что хорошее бросил Hudson-овский war в папку приложений Tomcat.
Используя Hudson web-интерфейс за пару минут создал два проекта которые проверяют SCM на наличие изменений, запускают билд, если изменения есть, высылает сообщение по почте и результат публикуют на FTP.
Ну а после того как обнаружил в списке дополнений слова cmake & scons... Я фанат Hudson-а!
Надо сказать, что я никому не посоветую CruiseControl.
вторник, 22 сентября 2009 г.
среда, 24 июня 2009 г.
удаление Visual Studio 2008
Собственно оказалось нетривиальной задачей...
Рекомендую воспользоваться инструментом от издателя.
Рекомендую воспользоваться инструментом от издателя.
вторник, 9 июня 2009 г.
про интернет в Калифорнии (продолжение...)
Сегодня прихожу на рабочее место - смотрю какой-то мужичек возле моего ноута крутиться.
- Вотс гоин он? говорю.
Он отвечает на чистейшем американском - а это ваш компьютер?
- Мой - говорю.
- А вы ничего большого не качали? - спрашивает он, видимо в надежде на отмазки.
- Качал говорю - не далее как в конце прошлой недели - 8 Гб за вечер утянул в торрентах с сайта Fedoraproject.org
- Ну вообщем-то говорит не большая проблема, просто вы канал нам просадили на прошлой недели в усмерть - никто работать не мог. Я - говорит - грешным делом на порновирус рассчитывал - а тут вы со своим Линуксом.
- Да - говорю я, не извиняясь - херня такая этот Линукс - говорю смотри - апдэйтов кажет 686 штук и показал значек ПэкаджКита. Хотя - говорю - на прошлой неделе не менее после установки вытянул...
- А ограничить по полосе его нельзя?
- Да можно, тока я думал у вас в Америке с пропускной способностью каналов проблем нет, начал я испорченный Иллинойсовским безлимитом на комкасте....
- Не делайте так больше - сказал мужик и ушел...
Вот такая вот поучительная история...
Походу тут каналы в Силиконке нифига не широкие...
И "палят" на них реально...
- Вотс гоин он? говорю.
Он отвечает на чистейшем американском - а это ваш компьютер?
- Мой - говорю.
- А вы ничего большого не качали? - спрашивает он, видимо в надежде на отмазки.
- Качал говорю - не далее как в конце прошлой недели - 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 мужик задал вопрос - а кто-нибудь перл собирал для ресурсо-ограниченного оборудования?
Видимо не очень ограничен, если спрашивает.
Прежде всего, хочеться отметить, что мне понравился сайт, как ресурс. Я давно на него поглядывал, но все не находил времени почитать. Интересные советы, статьи. Нельзя сказать, что все новое и незнакомое - где-то слышал то, где-то это...
Вообщем, иногда имеет смысл поглядывать, и не забывать.
Решил немного посчитать и поэкспериментировать.
Написал маленький и смешной кусок кода:
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 мужик задал вопрос - а кто-нибудь перл собирал для ресурсо-ограниченного оборудования?
Видимо не очень ограничен, если спрашивает.
воскресенье, 31 мая 2009 г.
крушение иллюзий...
Дмал хоть в силиконовой долине будет _быстрый_ беспроводной интернет. Как бы не так!!! Intel C/C++ Compiler for Linux качается уже 8 часов!!! И конца на видно...
В то же время Sun Developer Express вытянул за 4 часа.
Не совсем ясно почему так.
Результат трассировки говорит что интел вроде ближе
snikulov@linux-m0ft:/opt> traceroute www.intel.com
traceroute to www.intel.com (209.234.250.178), 30 hops max, 40 byte packets using UDP
1 10.10.10.1 (10.10.10.1) 152.980 ms 145.084 ms 147.297 ms
2 192.168.0.1 (192.168.0.1) 177.922 ms 175.383 ms 184.031 ms
3 bras6-l0.pltnca.sbcglobal.net (151.164.184.82) 188.939 ms 184.575 ms 178.264 ms
4 76.246.22.2 (76.246.22.2) 170.945 ms 167.853 ms 163.914 ms
5 151.164.93.237 (151.164.93.237) 155.814 ms 150.163 ms 142.610 ms
6 151.164.171.196 (151.164.171.196) 135.924 ms 130.859 ms 123.636 ms
7 asn3356-level3.eqsjca.sbcglobal.net (151.164.250.138) 31.344 ms 35.329 ms 47.115 ms
8 ae-13-69.car3.SanJose1.Level3.net (4.68.18.5) 47.623 ms ae-33-89.car3.SanJose1.Level3.net (4.68.18.133) 181.125 ms ae-13-69.car3.SanJose1.Level3.net (4.68.18.5) 89.511 ms
9 COTENDO.car3.SanJose1.Level3.net (4.71.112.50) 133.830 ms 38.267 ms 85.974 ms
10 te3-1.bbr1.lax1.bandcon.com (216.151.179.181) 123.315 ms 140.327 ms 137.079 ms
11 te3-2.bbr1.phx1.bandcon.com (216.151.179.197) 130.389 ms 125.480 ms 118.946 ms
12 te8-1.bbr1.dfw1.bandcon.com (216.151.179.210) 111.088 ms 104.126 ms 96.747 ms
13 209.234.250.178 (209.234.250.178) 89.029 ms 80.981 ms 76.275 ms
snikulov@linux-m0ft:/opt>
snikulov@linux-m0ft:/opt> traceroute www.sun.com
traceroute to www.sun.com (72.5.124.61), 30 hops max, 40 byte packets using UDP
1 10.10.10.1 (10.10.10.1) 240.749 ms 240.361 ms 232.654 ms
2 192.168.0.1 (192.168.0.1) 326.406 ms 333.125 ms 329.258 ms
3 bras6-l0.pltnca.sbcglobal.net (151.164.184.82) 344.893 ms 337.704 ms 348.631 ms
4 64.164.107.1 (64.164.107.1) 319.859 ms 334.167 ms 335.374 ms
5 * 69.220.8.95 (69.220.8.95) 691.902 ms 684.616 ms
6 * * *
7 asn3561-savvis.eqsjca.sbcglobal.net (151.164.89.134) 276.214 ms 136.078 ms 413.023 ms
8 208.175.172.10 (208.175.172.10) 432.797 ms 430.899 ms 424.730 ms
9 border2.te7-1-bbnet1.sfo002.pnap.net (63.251.63.17) 438.945 ms 438.397 ms 432.441 ms
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
В то же время Sun Developer Express вытянул за 4 часа.
Не совсем ясно почему так.
Результат трассировки говорит что интел вроде ближе
snikulov@linux-m0ft:/opt> traceroute www.intel.com
traceroute to www.intel.com (209.234.250.178), 30 hops max, 40 byte packets using UDP
1 10.10.10.1 (10.10.10.1) 152.980 ms 145.084 ms 147.297 ms
2 192.168.0.1 (192.168.0.1) 177.922 ms 175.383 ms 184.031 ms
3 bras6-l0.pltnca.sbcglobal.net (151.164.184.82) 188.939 ms 184.575 ms 178.264 ms
4 76.246.22.2 (76.246.22.2) 170.945 ms 167.853 ms 163.914 ms
5 151.164.93.237 (151.164.93.237) 155.814 ms 150.163 ms 142.610 ms
6 151.164.171.196 (151.164.171.196) 135.924 ms 130.859 ms 123.636 ms
7 asn3356-level3.eqsjca.sbcglobal.net (151.164.250.138) 31.344 ms 35.329 ms 47.115 ms
8 ae-13-69.car3.SanJose1.Level3.net (4.68.18.5) 47.623 ms ae-33-89.car3.SanJose1.Level3.net (4.68.18.133) 181.125 ms ae-13-69.car3.SanJose1.Level3.net (4.68.18.5) 89.511 ms
9 COTENDO.car3.SanJose1.Level3.net (4.71.112.50) 133.830 ms 38.267 ms 85.974 ms
10 te3-1.bbr1.lax1.bandcon.com (216.151.179.181) 123.315 ms 140.327 ms 137.079 ms
11 te3-2.bbr1.phx1.bandcon.com (216.151.179.197) 130.389 ms 125.480 ms 118.946 ms
12 te8-1.bbr1.dfw1.bandcon.com (216.151.179.210) 111.088 ms 104.126 ms 96.747 ms
13 209.234.250.178 (209.234.250.178) 89.029 ms 80.981 ms 76.275 ms
snikulov@linux-m0ft:/opt>
snikulov@linux-m0ft:/opt> traceroute www.sun.com
traceroute to www.sun.com (72.5.124.61), 30 hops max, 40 byte packets using UDP
1 10.10.10.1 (10.10.10.1) 240.749 ms 240.361 ms 232.654 ms
2 192.168.0.1 (192.168.0.1) 326.406 ms 333.125 ms 329.258 ms
3 bras6-l0.pltnca.sbcglobal.net (151.164.184.82) 344.893 ms 337.704 ms 348.631 ms
4 64.164.107.1 (64.164.107.1) 319.859 ms 334.167 ms 335.374 ms
5 * 69.220.8.95 (69.220.8.95) 691.902 ms 684.616 ms
6 * * *
7 asn3561-savvis.eqsjca.sbcglobal.net (151.164.89.134) 276.214 ms 136.078 ms 413.023 ms
8 208.175.172.10 (208.175.172.10) 432.797 ms 430.899 ms 424.730 ms
9 border2.te7-1-bbnet1.sfo002.pnap.net (63.251.63.17) 438.945 ms 438.397 ms 432.441 ms
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
воскресенье, 24 мая 2009 г.
размер имеет значение...
Партия поставила задачу сократить размер инсталляции встроенного обеспечения вдвое...
Поковырялись в ELDK, немножко сократили за счет реорганизации инсталляции, но все равно не хватает.
Возникла мысль выкинуть C++ рантаймовую либу.
Для этого необходимо переписать парочку модулей на C.
Начал смотреть библиотеки для C.
Интересными для исследования показались:
Может еще кто что подскажет? :-)
Поковырялись в ELDK, немножко сократили за счет реорганизации инсталляции, но все равно не хватает.
Возникла мысль выкинуть C++ рантаймовую либу.
Для этого необходимо переписать парочку модулей на C.
Начал смотреть библиотеки для C.
Интересными для исследования показались:
- A Simple Generic Library for C (http://sglib.sourceforge.net/)
- C Algorithms (http://c-algorithms.sourceforge.net/)
- c-generic-library (http://code.google.com/p/c-generic-library/)
Может еще кто что подскажет? :-)
суббота, 23 мая 2009 г.
мысли на ночь :)
Что-то возникло желание прикупить нетбук Eee Pc с Linux на борту.
Усиленно с ним борюсь :)))
Приятно, что он так долго живет без питания...
Усиленно с ним борюсь :)))
Приятно, что он так долго живет без питания...
Подписаться на:
Сообщения (Atom)