LINUX.ORG.RU

Почему Rust в 2 раза медленнее Си?

 , ,


0

5
% time ./c
./c  2.02s user 0.02s system 99% cpu 2.040 total
% time ./rust
./rust  4.84s user 0.04s system 99% cpu 4.886 total

Код на Си:

#include <stdio.h>

int slow_sqrt(int nbr)
{
	int i = 1;
	while (i < nbr)
	{
		if (nbr / i == i)
			{
				return i;
			}
		i++;
	}
	return 0;
}

int main(void)
{
	printf("Number %d", slow_sqrt(2147483646));
	return 0;
}

Код на Rust:

fn main() {
    let x: i32;
    x = slow_sqrt(2147483646);
    println!("Number {}", x);
}

fn slow_sqrt(nbr: i32) -> i32 {

    let mut i = 1;

    while i < nbr {
        if nbr / i == i
        {
            return i;
        }
        i += 1;
    }
    return 0;
}

По всей видимости Rust еще сырой язык для профессиональной разработки. Буду использовать Си.

Ответ на: комментарий от Vic

Наличие дополнительных абстракций, которых в процессорах нет и которые процессорам чужды. Были попытки сделать JAVA процессор

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

операционки пишутся не полностью на ассемблере, даже наоборот, чем меньше ассемблера в операционке, тем лучше. Но, без ассемблера никак.

А если ассемблера в системе нет, то это не операционка? Или компилятор системного языка программирования высокого уровня это на самом деле ассемблер, который от нас скрывают?

Assembler

There is no assembler on the Unisys MCP operating system.

vM ★★
()
Ответ на: комментарий от vM

Или компилятор системного языка программирования высокого уровня это на самом деле ассемблер, который от нас скрывают?

Совершенно верно. Ребята просто «скрестили ужа с ежом» и преподнесли всему миру (и инвесторам) как «инновация» — взяли любимый им язык ALGOL, добавили в него «ассемблер», получили свой «язык» = ESPOL.

Вот кусок кода в компиляторе, где объявляется соответствие мнемоник и машинных кодов — такие вещи есть в любом компиляторе ассемблера:

...
 ALPHA ARRAY OPS[0:768];        % OPERATOR MNEMONICS FOR BUGOUT         10206000          
     DEFINE VALC= 63#,NAMC=127#,ADD =128#,SUBT=129#,MULT=130#,DIVD=131#,10207000          
  IDIV=132#,RDIV=133#,NTIA=134#,NTGR=135#,LESS=136#,GREQ=137#,GRTR=138#,10208000          
  LSEQ=139#,EQUL=140#,NEQL=141#,CHSN=142#,MULX=143#,LAND=144#,LOR =145#,10209000          
  LNOT=146#,LEQV=147#,SAME=148#,VARI=149#,BSET=150#,DBST=151#,FLTR=152#,10210000          
  DFTR=153#,ISOL=154#,DISO=155#,INSR=156#,DINS=157#,BRST=158#,DBRS=159#,10211000          
  BRFL=160#,BRTR=161#,BRUN=162#,EXIT=163#,STBR=164#,NXLN=165#,INDX=166#,10212000          
  RETN=167#,DBFL=168#,DBTR=169#,DBUN=170#,ENTR=171#,EVAL=172#,NXLV=173#,10213000          
  MKST=174#,STFF=175#,ZERO=176#,ONE =177#,LT8 =178#,LT16=179#,PUSH=180#,10214000          
  DLET=181#,EXCH=182#,DUPL=183#,STOD=184#,STON=185#,OVRD=186#,OVRN=187#,10215000          
...

Причем они «инновировали» вместе с конструкторами железа, т.к. и процессор и периферия очень уникальны и нигде больше не встречаются.

Набор инструкций этих процессоров тоже уникален и удивительным чудом сохранился в интернете (там как раз и даны мнемоники и описание).

Почему удивительным? Да потому что подобных изысканий в те времена было очень много и в каждом ВУЗе, отдельных лабораториях и КБ по всей планете кто-то что-то мастерил на тему процессоров и архитектур, которые канули в лету и упоминания о которых вы не найдете ни в одной википедии! А вот этот «BUGOUT», на который вы ссылаетесь, просто случайно (ли?) «имел хорошее финансирование», поэтому о нем есть записи в вики и в публикациях (т.к. без этого грантов не освоить).

Vic
()
Последнее исправление: Vic (всего исправлений: 3)
Ответ на: комментарий от Vic

процессор и периферия очень уникальны и нигде больше не встречаются.

Набор инструкций этих процессоров тоже уникален и удивительным чудом сохранился

Программная платформа надолго пережила исходную аппаратуру: выжившие с 1960-х альтернативы IBM по цепочке поглощений объединились в UNISYS.

Желающие могли в пандемию мышеклично попрограммировать и отлаживать свои програмки на NEWPах и ALGOLaх с помощью плагинчика для Microsoft Visual Studio

https://public.support.unisys.com/c71/docs/VSIDE-6.0/82300864-006.pdf

https://youtu.be/5PYMDvu7BAM?t=106

и сохранять исходники с виртуального мейнфрейма себе на планшет с оффтопиком.

Или мигрировать в оффтопные облака https://learn.microsoft.com/en-us/azure/architecture/example-scenario/mainframe/unisys-clearpath-forward-mainframe-rehost

кусок кода в компиляторе, где объявляется соответствие мнемоник и машинных кодов — такие вещи есть в любом компиляторе ассемблера:

Подобные куски можно встретить в отладчике, в генераторе кода любого JIT или AOT компилятора, который умеет делать объектный код самостоятельно без внешних утилит. Да и в обработчике линуксового панического BUGOUT’a подобная табличка может быть полезна

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/lib/x86-opcode-map.txt

vM ★★
()
Ответ на: комментарий от vM

Подобные куски можно встретить в отладчике

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

в генераторе кода любого JIT или AOT компилятора, который умеет делать объектный код самостоятельно без внешних утилит

«JIT» и «AOT» это не сами компиляторы, а классификация возможности в какой-то системе на тему запуска и исполнения пользовательских программ, а не «системных».

Например, если мы возьмем любой классический компилятор Си/С++/Ассемблер/Pascal и т.п. - эти программы относятся к классу AOT.

А если начнем рассматривать системы, которые создают свой промежуточный уровень абстракции (скрывая конкретную аппаратуру), например Android, то для исполнения пользовательских программ в нем уже применяется комбинированная техника JIT+AOT (и не важно сколько разных ли встроенных утилит при этом используется).

Так что как бы кто-то не пытался обмануть природу вычислительной техники, базу, в виде ассемблеров и реассемблеров, никуда не деть, потому что ее определяет текущая информационная модель подавляющего большинства процессоров + относительная легкость восприятия человеком отдельных моментов. Т.е. нам приходится копаться в сделанных программах и делать вставки в новых программах, что бы у нас получилось именно то, что задумано на имеющихся процессорах (их инф. модели).

PS.

Эмуляторами сейчас никого не удивишь, хотя, это интересно, познавательно и вообще, круто! Особенно круто, когда эмулируется целая крупная система.

Vic
()
Последнее исправление: Vic (всего исправлений: 5)
Ответ на: комментарий от Vic

базу, в виде ассемблеров и реассемблеров, никуда не деть,

база - это целевая платформа и ISA - одна из частей, определяющих платформу.

Обозначения и мнемоники для ассемблеров и комментариев в правой части листнгов и дампов можно выбирать произвольно. Это не база, а произвольный выбор изобретателей ассемблеров и их пользователей.

(as -msyntax=intel -mnaked-reg -al /dev/stdin <<< 'mov dl,cl';objdump -D -M intel) | grep mov
   1 0000 88CA          mov dl,cl
   0:   88 ca                   mov    dl,cl
(as -msyntax=att -mnaked-reg -al /dev/stdin <<< 'mov dl,cl';objdump -D -M intel) | grep mov
   1 0000 88D1          mov dl,cl
   0:   88 d1                   mov    cl,dl
vM ★★
()