ha
Архиватор HA на «Эльбрусе»
Мы тут «Эльбрус» решили оживить, который был куплен несколько лет назад для одного из проектов. Проект закончился и компьютер с тех пор лежал на складе.
Внутри стоит восьмиядерный процессор
Я, чтобы прикинуть его производительностью, решил попробовать повторить на нём свой недавний эксперимент — скомпилировать архиватор ha и засечь время, — за сколько он на этой машине сожмёт «Дум».
Там довольно старая операционка стоит с компилятором gcc 7.3.0 и нет cmake. Пришлось переписать компиляцию на make и компилировать тем, что есть. Наверное новый компилятор соптимизировал бы код лучше, но взять его некуда — надо переставлять операционную систему, а это целая история.
На «Эльбрусе» «Дум» сжался за 18,77 секунды против 4,3 секунды на моём ноутбуке с M3 Max. Разница более чем в четыре раза. Я даже не знаю — много это или мало. Надо, наверное, посмотреть
Архиватор HA и современные компьютеры
Узнал сегодня о существовании архиватора lzip — им сжат исходный код свежей версии утилиты bc.
Пока ехал домой, мысли крутились вокруг архиваторов
Я подумал — было бы интересно скомпилировать этот архиватор под мой процессор M3 Max, который сейчас считается довольно мощным, и посмотреть за какое время на нём сожмётся «Дум».
Ответ — «Дум» теперь сжимается за 4,3 секунды! Надо будет повторить эксперимент лет через 10.
Кстати, результаты по коэффициенту сжатия тоже довольно достойные — сжалось чуть лучше, чем утилитой gzip и чуть хуже, чем bzip2. Но lzip, что было для меня полной неожиданностью, оставил всех далеко позади:
-rw-r--r-- 1 bolk staff 3688370 May 29 21:37 doom.tar.lz
-rw-r--r-- 1 bolk staff 5226359 May 29 21:39 doom.tar.bz2
-rw-rw-r-- 1 bolk staff 5312857 May 29 21:35 doom.ha
-rw-r--r-- 1 bolk staff 5497638 May 29 21:39 doom.tar.gz
HA
Сначала немного не по теме.
Все файлы на виртуалку я переношу через образ дискеты
dd if=/dev/zero of=floppy.img bs=1024 count=1440
diskutil eraseVolume MS-DOS VOLUME `hdiutil attach -nomount floppy.img`
hdiutil attach floppy.imgПоследняя команда смонтирует получившийся образ, после чего можно записать туда любые файлы.
Как справедливо напомнили читатели в комментариях к моему эксперименту c ARJ,
Для тестирования я выбрал форк архиватора, с которым сталкивался во времена интереса к языку программирования
99 бутылок: C--, WSH
12. Sphinx
Язык мне показался обычным ассемблером, с внедрёнными элементами синтаксиса Си. Этакий навороченный макроассемблер. Попался бы мне такой лет так пять назад — оторвал бы с руками, а сейчас… Но, хотя на ассемблере теперь я пишу только мелочь, а мелочь лучше писать без применения всяческих прилад, стирать все же не буду — вдруг пригодится.
P.S. Кстати, на страничке языка можно скачать архиватор HA, переписанный
Программа, выводящая песню о пиве.
?use80486
?include "WRITE.h--"
void PRINTBEER ()
{
$PUSH AX;
IF (AX) WRITEWORD (AX); ELSE WRITESTR ("No");
WRITESTR (" bottle");
$POP AX;
IF (AX<>1) WRITE ('s');
WRITESTR (" of beer");
}
void main()
byte bott;
byte beer = 99;
{
WHILE (beer)
{
PRINTBEER (beer);
WRITESTR (" on the wall, ");
PRINTBEER (beer);
WRITESTR (".\nTake one and pass it around,\n");
beer--;
PRINTBEER (beer);
WRITESTR (" on the wall.\n\n");
};
WRITESTR ("No more bottles of beer...\n");
WRITESTR ("Go to the store and buy some more...\n");
WRITESTR ("99 bottles of beer.");
AX = 0x4C;
$INT 0x21;
}13. Windows Script Host — технология, заботливо упрятанная в недра вашей Windows заботливой компанией Microsoft. Скрипт написан с применением второй версии технологии, которая распространяется вместе с Windows 2000. Впрочем, ничего не мешает поставить его на любую другую ОС этого семейства. Базируется она на JScript или VBScript и позиционируется как замена пакетному (batch) языку DOS.
Способ запуска: wscript.exe beer.js. Во время выполнения настоятельно не рекомендуется переключать окна.
Скрипт, выводящий песню о пиве (beer.js).
function PrintBeer(i)
{
return (i?i:"No")+" bottle"+(i-1?'s':'')+" of beer"
}
WshShell = WScript.CreateObject("WScript.Shell")
with (WshShell)
{
Run("notepad.exe")
WScript.Sleep(100)
AppActivate("Untitled - Notepad")
for (i = 99; i>0;)
{
SendKeys (PrintBeer (i)+" of beer on the wall, ")
SendKeys (PrintBeer (i)+".~")
SendKeys ("Take one and pass it around,~")
i--
SendKeys (PrintBeer (i)+" on the wall.~~")
}
SendKeys ("No more bottles of beer...~")
SendKeys ("Go to the store and buy some more...~")
SendKeys ("99 bottles of beer.")
}