LINUX.ORG.RU

Rust vs C

 ,


3

7

Я Rust не знаю.
Допустим решил я написать быстрый лексер (разбиватель токенов),как я делаю это в Си:

typedef struct {
    const char* text;
    size_t      text_len;
    size_t      text_pos;

    const char* token;
    size_t      token_len;
} lexer_t;
 
void lexer_next_token(lexer_t* lexer);

И я могу получить все токены без выделения памяти,я просто иду по тексту и ставлю lexer_t.token в начало токена, и в token_t.token_len записываю длинну токена.А в расте как сделать подобную вещь?Тоже без выделения памяти естественно (ну кроме стека,где выделяется код возврата и 2 size_t для функии next_token).Верней можно ли сделать такое в расте?



Последнее исправление: linuhs_user (всего исправлений: 2)

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

Оно собирается со всеми зависимостями, включая токио, мио и hyper около 80 секунд.

Да что же ты такой тупой-то, а. Тебе же уже объяснили разницу. Когда у тебя 100500 разных либ - оно собирается быстро за счёт того, что они независимые и собираются отдельно.

Когда у тебя один проект, то он собирается вместе. Ты собираешь 100500 говнолиб, которые no_stdlib и которые убогие хелворды ничего не могущие.

Asio собирает за пару секунд, а не за 80. Никаких зависимостей. При этом asio - это монолит, а не не попиленное на 100500 частей дерьмо.

Точно так же, если бы ты написал что-то не хевордистое - оно бы собиралось три часа, как это делает твой компилятор.

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

Тебе написали про пруфы.

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

выкатывай выхлоп --verbose своей лто сборки.

Я хз что ты там за verbose нагаллюцинировал и откуда я тебе его должен высрать.

Для того, чтобы собрать всё с lto - нужно собрать всё с лто, а потом всё это слинковать.

Ты решил в капитана-очевидность поиграть?

Говоришь что LTO в расте нет — будь добр подтверждай свои слова фактами, а то команда разработки языка и не знала.

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

Пардон, ничего не понял из вашего текста ко мне.

я глупость сморозил. vodz поправил. я извинился. Всё чинно и спокойно.

Ну, то есть... Пытался сказать, что память не надо выделять (как мне кажется) вообще нигде - ни в стеке, ни в куче. Ни быстро, ни медленно. Если задача такая узкая и специфическая. Достаточно просто выделить буфер в .DATA по задаче, который по необходимости ты сам и будешь интерпретировать, как тебе вздумается.

Насколько я понимаю (очень поверхностно) - в современном мире как раз от этого и пытаются уйти заворачивая в недостижимые дали обращение к и интерпретацию данных в памяти. Сейчас не модно писать .com длиной в 100 (сто) байт, рисующий Мандельброта. Да и не нужно.

«Зелёной публике» есть что почерпнуть у vodz. Я не зеленый, я скорее протухший. Но мне тоже интересно. Принятые тут взаимные оскорбления же можно просто не читать, фильтруя значимую информацию.

Deleted
()
Ответ на: комментарий от anonymous

независимые и собираются отдельно.

Да, а еще зависимостей между кодгеном либ видимо не существует. А собираются они в эфире тысячами фей мгновенно, а не на CPU с ограниченным числом тредов.

если бы ты написал что-то не хевордистое - оно бы собиралось три часа

«100500 говнолиб», которые cargo собирает вместе с моим проектом из исходников, с чистым кэшем за 80 секунд — видимо все «хевордистые»

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

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

Ты ничего не можешь делить - ты просто врёшь и игноирруешь лужи. Ты балабол и не более того.

Я хз что ты там за verbose нагаллюцинировал и откуда я тебе его должен высрать.

http://bfy.tw/EDku

Ты решил в капитана-очевидность поиграть?

Нет, тебе идиоту объясняют, что если ты там что-то куда-то добавил - это не значит, что ты собрал с лто. И тебе объяснили почему.

Говоришь что LTO в расте нет

Опять же балаболка врёт. Я не говорил что лто в расте нет - я говорил, что его нет у тебя. Всё просто. И то, даже не говорил что нет, а говорил, что ты идиот и скорее всего не осилил им воспользоваться правильно.

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

Нет, тебе идиоту объясняют, что если ты там что-то куда-то добавил - это не значит, что ты собрал с лто.

То есть, ты считаешь, что если я сказал cargo собирать с LTO, сargo нагло меня обманул и собрал без? Опять же, давай пруфов.

И тебе объяснили почему.

Нет, мне выдали очередную галлюцинацию анонимуса, ничем не подкрепленную кроме мнимого царского «знания».

Я не говорил что лто в расте нет - я говорил, что его нет у тебя.

Во блин. Я думал, что на расте пишу, а оказывается на питоне. Ты открыл мне глаза.

mersinvald ★★★★★
()
Последнее исправление: mersinvald (всего исправлений: 1)
Ответ на: комментарий от anonymous

И если ты хочешь флагов — пожалуйста.

rustc --crate-name positions_api src/main.rs --crate-type bin --emit=dep-info,link -C opt-level=3 -C panic=unwind -C lto -C metadata=5d1ff8946c4ee735 -C extra-filename=-5d1ff8946c4ee735 --out-dir /home/mike/dev/devheap/circles-server/target/release/deps -L dependency=/home/mike/dev/devheap/circles-server/target/release/deps --extern error_chain=/home/mike/dev/devheap/circles-server/target/release/deps/liberror_chain-86d2fa7de3b7da66.rlib --extern fern=/home/mike/dev/devheap/circles-server/target/release/deps/libfern-0face2704c8b8ca9.rlib --extern futures=/home/mike/dev/devheap/circles-server/target/release/deps/libfutures-989a9e1fa2259ead.rlib --extern serde_json=/home/mike/dev/devheap/circles-server/target/release/deps/libserde_json-f0070ca9e00663f7.rlib --extern log=/home/mike/dev/devheap/circles-server/target/release/deps/liblog-04e3d428c74350b3.rlib --extern circles_common=/home/mike/dev/devheap/circles-server/target/release/deps/libcircles_common-41dc08eca89be59a.rlib --extern hyper=/home/mike/dev/devheap/circles-server/target/release/deps/libhyper-32c9649d9b3531b5.rlib --extern tokio_core=/home/mike/dev/devheap/circles-server/target/release/deps/libtokio_core-cb7541724cbaab8f.rlib --extern chrono=/home/mike/dev/devheap/circles-server/target/release/deps/libchrono-b31aba055f443e3d.rlib -L native=/usr/lib -L native=/home/mike/dev/devheap/circles-server/target/release/build/backtrace-sys-f5bdffe2effb5b1c/out/.libs`

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

Ну что за идиот. Это даст как минимум то, что каждый объектник собран с lto. Хотя на самом деле это и этого не даст, но хотя бы даст то, что в rustc lto передаётся как флаг.

Как всегда идиот несёт в очередной раз какую-то ахинею.

anonymous
()
Ответ на: комментарий от mersinvald

Вот то, о чём я говорил. Идиот не понимает того, что его флаг в фильную линковку ничего не значит и все объектники без метаинфы будут собраны как обычно даже с лто.

anonymous
()
Ответ на: комментарий от RazrFalcon

Как я уже множество раз говорил - идиот настолько туп, что сам себя проявит. Вот тебе пруф Rust vs C (комментарий) в рамках которого идиот доказывает наличие lto в финальной линковки рандомных объектиков.

Собственно то, что я и говорил. А балаболы в очередной раз обосрались. Ничего нового.

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

rustc по дефолту эмитит при сборке либ инфу, которая может потребоваться для LTO вне зависимости от флагов сборки финального бинарника. пруф.

Ты опять обосрался

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

Обсираешься раз за разом тут сейчас только ты. Еще раз: сначала гуглишь, потом споришь, всё очень просто.

mersinvald ★★★★★
()

сравнение в принципе не корректно.

это разные языки с похожим синтаксисом.

anonymous
()
Ответ на: комментарий от mersinvald

Как всегда жалкие попытки амёбы что-то пердеть.

Идём сюда: Rust vs C (комментарий)

И идём сюда:

When the compiler detects the -Z lto option

Что? Где -Z lto? Обосрался. Нету.

Идём далее:

this process is excruciatingly slow, so this is

*not* turned on by default, and it is also why I have decided to hide it behind a -Z flag for now. The good news is that the binary sizes are about as small as they can be as a result of LTO, so it's definitely working.

Ой, оказывается ничего из этого не врублено и без -Z флага не работает. Опять обсёр.

Ну и самое главное - это высрано кое-как только в последней версии и то - неизвестно насколько это lto lto. Т.к. это левое lto.

rustc по дефолту
this is *not* turned on by default

которая может потребоваться для LTO

Совершенно не то lto.

вне зависимости от флагов сборки финального бинарника.

I have decided to hide it behind a -Z flag for now

Какие ещё нужны доказательства? Диагноз - невменяшка поехавшая в дрова.

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

Что? Где -Z lto? Обосрался. Нету.

Какой же ты даун.

-C lto

https://github.com/rust-lang/rust/issues/12443

За -Z оно лежало пока было в глубоком nightly как дебаг-флаг. Стабилизировали — перенесли в флаги компилятора (-C)

Я от тебя дождусь адеквата и проверки фактов перед написанием очередных обосрамсов, или сколько мне тебя еще в дерьмо мокать?

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

Обсираешься раз за разом тут сейчас только ты.

Еще раз: сначала гуглишь, потом споришь, всё очень просто.

Ещё раз, мусор, нахрен ты мне что-то кудахчешь? Ты убогий, лсный, одноклеточный нонейм даун с помойки.

Я уже 20 раз и тебе и подобным тебе идиотом объяснял. Меня не интересует то как ты будешь прятаться за гугл. Меня интересует лишь то, что ты кукарекаешь и разбираю только то, что ты кукарекаешь.

Гугл, хреногугл и прочее меня не интересуют. Я показываю людям то, что ты и подобные тебе - идиоты. Которые нихрена не знают, которые могут только одно - ретранслировать ахинею, запутаться в трёх соснах, обосраться и слиться на гугл.

Давай попроще. Вот я спорю со школотроном и он мне рассказывает о том - почему земля круглая. И если мне школотрон вася начинает задвигать про то, что она круглая потому что «петя её накачал как шарик», а после я назову его идиотом и укажу на несостоятельность его потуг.

Знаешь что сделаешь школотрон? То же, что сделал ты. Кинет мне ссылку на «земля круглая» и скажет - «ты споришь с тем, что земля круглая - ты идиот». Нет, идиот, я спорю не с тем, что она круглая, а теми потугами, что про её круглоту насёшь ты, и с теми потугами-причинами, которыми ты обосновываешь её круглоту.

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

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

Меня интересует лишь то, что ты кукарекаешь и разбираю только то, что ты кукарекаешь.

Я уже дважды с пруфами доказал, что ты бесполезный балабол.

Ты — не сказал ничего по делу и никак свои слова не обосновал, лишь кукарекаешь и изливаешь свои фантазии тоннами текста. И кто тут школотрон?

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

большинство не способно понять таких простых вещей и вы до сих пор не метёте улицы, а иначе бы давно мели.

Можно думать, что ты эти вещи понимаешь и по этому метешь улицы?

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

Какой же ты даун.

В этом вся проблема идиотов. Ты пастил пруф, в котором оказалось не то, что ты пастил. Зачем ты его пастил?

Я от тебя дождусь адеквата и проверки фактов перед написанием очередных обосрамсов, или сколько мне тебя еще в дерьмо мокать?

Ты никого и никуда не мокнул. Ты пруфцуешь в рамках пруфцов, а если из твоих пруфцов ничего не следует, то они не верные. Всё просто.

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

Надеюсь кто-то с уровнем развития выше табуретки тут есть - для них пишу.

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

Т.е. если бы амёбы могли бы в логику, то они увидели бы а) мой вопрос про доказательства наличия лто т.к. за секунду не работает( я это сообщил как то свойство твоего высера из которого следует, что лто там нет). Далее я тебе сообщил, что вставка lto в финальную линковку не даёт лто. Ты обосрался.

Далее начал нести ахинею. Т.е. если бы ты тогда знал то же, что ты кукарекаешь сейчас - ты бы чётко мне ответил «лто в расте не лто( хотя это не обязательно), а lto в финальной в финальной сборке достаточно по такой-то причине».

Ты этого не сделал - причина? А причина проста - ты нёс ахинею. И то, что лто в расте реализовано иначе и вообще прикручено с боку - это просто везение.

Т.е. Ты не доказал то, что моя логика не работает. Ты ничего не доказал и ничего не сделал. Я нигде не утверждал «в расте лто нет»( как ты уже пытался врать), либо ещё какая херня.

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

Ты слился на какое-то левое лто( это даже не лто - оно не времени линковки)

И откуда ты это взял?

мой вопрос про доказательства наличия лто т.к. за секунду не работает

Где я писал, что LTO работает за секунду?

лто в расте не лто

Смотри ссылки выше, ты обосрался.

лто в расте реализовано иначе

А это ты откуда взял?

Кончай галлюцинировать, маня.

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

если из твоих пруфцов ничего не следует, то они не верные.

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

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

Какой же ты даун

Пока в треде наблюдаю двух даунов, спорящих с чокнутым ботом. Оба многозвездные регистранты и фанбои новомодной параши, что характерно.

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

Я бы предложил тебе перелогиниться, но тут хрен разберешь

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

Продолжайте вести Ваши наблюдения! Но они неточны, потому что с Вами мы не спорим.

многозвездные регистранты

Почему-то от звёзд бомбит тех, у кого их нет. Совпадение?

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

Не волнуйся, амёба. Для того, чтобы тебя в дерьмо втоптать мне достаточно задать вопрос: «что ты доказал и где?» и ты обосрёшься.

А вот я докажу то, что ты обосрался.

А теперь я подтвержу ещё один свой тезис про фейковое лто. Вместе с твоей потугой выдавания за lto раст-лто. То, что ты выдал за lto - это не lto. Названа она так лишь потому, что rustc передётся ar, но это не линковка - вернее lto это стадия не времени линковки, а времени компиляции. Хотя ладно, это слишком сложно для амёб.

4,6M server_no_lto
3,6M server_lto  
3,5M server_empty_main  
2,3M server_empty_main_lto  
2,3M server_empty_main_lto_no_extern  

Т.е. а) никакого лто как минимум для половины кода нет. б) никакого лто как такового нет. Причин несколько:

1) 2.3метра на пустом мейне. 2) разница между хелвордом и полной линковкой 1 метр, а разница между пустым мейном и хелвордом с лто 1.3 метра, т.е. хелворд каким-то образом использует более 50% кода линкуемого с хервордом.

При этом объём объектников-зависимостей в районе 9 метров(я не сравнивал то - собирает ли оно со всеми, либо нет. Даже если половина - это явно больше).

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

По поводу производительности:

//rustc --crate-name server examples/server.rs 
   Finished release [optimized] target(s) in 16.2 secs

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

Но похоже в реализации раст-лто дальше выкидывания не используемого не ушли.

anonymous
()
Ответ на: комментарий от Virtuos86

Жаль звезд так мало дают. По ним так легко определять никчемных балаболов и красноглазов. Ты вот тянешь на все 10. А для тылгунера так и строки бы не хватило.

anonymous
()
Ответ на: комментарий от mersinvald

И откуда ты это взял?

Из твоей ссылки и читай выше.

Где я писал, что LTO работает за секунду?

Ты выдавал в районе 10секунд в сравнении с 7 как разницу между -O0 и -O3 + lto. Я взял половину за O3, а половину за лто. При этом я нигде не говорил, что писал это ты.

Смотри ссылки выше, ты обосрался.

Ты пастишь херню, а далее пишешь, что я обосрался. Ты так и не ответил на вопрос - в чём же я обосрался? И что же ты конкретно там доказал.

Ответил бы ты вовремя - ты бы мог опровергнуть мои предположения, но ты обосрался. Ты не предоставил аргументацию вовремя, а далее выкатил херню, которая оказалось не тем о чём я говорил. Из этого ничего не следует, кроме того, что в расте не ллвм-лто.

Но опять же - знал бы ты это - бы ответил мне сразу. Мои претензии были обоснованы. Как были - так и остались.

А это ты откуда взял?

Два раза повторил одно и то же? Тебе чётко и ясно написали выше. Как и в твоей ссылке.

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

Жаль звезд так мало дают.

Вас обманули, звёзды никто не даёт, они автоматически добавляются по одной за каждую сотню баллов скора. Вот скор можно заработать, но я не припомню за собой такого. У меня пять звезд загорелись за семь лет регистрации — не сказал бы, что это ультра-быстро. В практическом плане единственная польза от звёзд — видеть, как у кого-то бомбит от придания этой мишуре какого-то особого смысла.

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

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

Не верно. Сел в лужу именно ты. Причины просты. Я говорил в рамках lto и определял те предпосылки, которыми я руководствовался, когда оспаривал твои выводы.

Я не утверждал про раст, его лто. Это ты придумал и наврал, чтобы не обосраться на публике. Авось схавают.

Далее ты мне выкатил финальную сборку как пруф, но это не пруф. С тем, что у тебя было lto в финальной сбрке никто не спорил( и ты этого нигде не найдёшь. Тебе именно что и говорили, что его недостаточно, а значит он был).

Т.е. ты тут уже обосрался - ведь ты мог изначально опровергнуть мои предьявы тем, что «метаинфа для лто собирается по дефолту, даже без лто». Ты этого не сделал - почему?

Я уже говорил, потому что ты ничего не знал и просто трепался. Иначе причин для подобного поведения нет.

Далее ты выкатил свою херню как пруф, но при этом выкитил не актуальный пруф и опять обосрался. Т.к. никто не обязан следить за актуальностью твоих пруфов.

Ты бы мог попытаться сослаться на то, что информация об включении bc в ar актуальна и сейчас, но ты этого не сделал - причина проста. Ты несёшь ахинею.

Хотя пруф всё равно не актуален, ибо твой запуск ему не соответствовал.

Идём далее, даже когда ты высрал это - это ничего не изменило. Ты ничего этим не сделал - ты лишь доказал( на самом дел обосрался - выше я выкатил время lto) то, что ты не врал. И всё.

Ты не опроверг меня, ты не выиграл меня. Ты просто доказал то, что ты врубил лто(на самом деле нет, опять же).

а теперь пытаешься прикидываться дурачком, придираться к мелочам (как с флагом -Z), и выставлять себя еще большим идиотом.

Нет, именно ты пытаешься прикидываться дурачком и делать вид, что ты что-то выиграл. Хотя на самом деле ты ничего не выиграл - ты просто подтвердил своё балабольство.

Всё мои предьявы к тебе обоснованы и ты ни одно из этих обоснований не опровергнешь т.к. ты лсный балабол. Всё просто.

anonymous
()
Ответ на: комментарий от Virtuos86

Вас обманули, звёзды никто не даёт

Фух, какой же ты тупой. Даже скучно тебя троллить. Хотя о чем тут говорить, если семилетний регистрант ведет просветительские беседы с царем. Ты наверно и с копипастой общаешься, растолковываешь ей премудрости раста. Свидетель #memorysafety, блджад.

anonymous
()
Ответ на: комментарий от RazrFalcon

Кстати, вася. Мне вот интересно - почему та амёбка не кудахчет о том, что оно тебя в дерьмо макает? Ведь в отличии от меня - ты прямо утверждал обратное.

anonymous
()

Перестаньте откапывать стюардессу.

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

Пока в треде наблюдаю двух даунов, спорящих с чокнутым ботом. Оба многозвездные регистранты и фанбои новомодной параши, что характерно.

Да, растосектанты не перестают меня удивлять.

anonymous
()
Ответ на: комментарий от pftBest

Пока я нашёл время тебе ответить - ты выпилил что ли?

Для тех кто не читал весь тред, повтори еще раз чего тебе не достаточно?

Я говорил о том, что лто - это такая штука, которая если есть и включена - не обязательно полноценная(т.е. полноценная оптимизация времени линковки). «никакого» - это в контексте «полноценного».

LTO в расте работает абсолютно также как и в шланге.

Ну я же вижу результаты. Почти 2.5 метра бинарей идут мимо лто, ещё почти полтора метра занимает хелворд. Какая бы лапша там не была - это невозможно. Невозможно, чтобы bind + один обработчик с роутером уровня get/post раскрывался в 1.3 метра бинаря. Ну никак.

Это, конечно же, возможно. Но я в это не верю.

Единственное исключение сишные зависимости libunwind и jemalloc, которые в LTO не участвуют и линкуются в конце как обычно.

Ну вот ты и сам назвал отличие. lto спокойно линкует сишный и крестовый код - у раста другой формат объектников? Не думаю. lto на то lto, что оно уровня линковки, а у тебя линковка вообще какая-то стадия после раст-lto.

Но то же самое будет и в плюсовом коде если не статически линкуешь musl какой-нибудь.

Проблема в том, что в расте статическая линковка.

Открываешь hello.ll и видишь там промежуточный код всей стандартной библиотеки раста, а так же код всех rlib зависимостей если они есть.

Ну, собственно, это ничего не доказывает. Я выше предполагал, что это просто инклюды. Значит это так и есть. 68 год( хотя на самом деле лучше инклюдов ничего нет и им lto не нужно).

Открываешь hello.ll и видишь там промежуточный код всей стандартной библиотеки раста, а так же код всех rlib зависимостей если они есть.

Поздравляю, ты показал инклюды.

При сборке с оптимизациями -C opt-level=3 на вход llvm попадет один большой модуль, и будет оптимизирован целиком, в чем собственно и весь смысл LTO.

Это не смысл лто - это смысл ipo с полным контекстом. Смысл лто в том, чтобы прозрачно интегрировать это ipo между единицами трансляции. Т.е. в ущербанскую раздельную компиляцию. Чего, у тебя, явно нет. Судя по всему - у тебя там тупой инклюд.

Кстати, распространенное заблуждение, llvm не выкидывает неиспользуемые не internal функции,

Их можно выкидывать ещё на стадии объектников. На уровне линковки нет уже никакого external. Да и в нормальных компиляторах уже и на уровне объектика можно выпилить external(whole-program).

не важно есть LTO, или нет, это делает линкер флагом --gc-sections.

Важно. Оно нахрен тогда не упало - пошел и проверил. Всё выпиливает, что в гцц, что в шланге. Без --gc-sections.

В конечном итоге мы имеет то, что это не lto в нормальном понимании - это какие-то bc-инклюды. Это первое.

Второе - оно как-то очень странно работает. Вернее как-то нихрена не работает - как максимум там есть примитивный фильтр уровня "--gc-sections".

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

Таким образом ну это максимум тыща-две строк. Не более. Ни от какого рантайма( ваш же раст не пхп?) этот код зависеть не должен.

Хотя я мерил это и на мустом мейне, который вообще должен раскрываться в ноль - всегда. Чего мы не видим, а видим 2.5метра.

Но каким хреном получается 2.5метра - это мне неведомо. Это невозможно объяснить.

Есть несколько вариантов. lto - это bc-инклюды. На 20метрах кода llvm просто вставал раком и ваятели просто выкрутили ручки в ноль. Либо в llvm просто по умолчанию лто подобного уровня.

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

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

Я написал почему выпилил комментарии, с тобой спорить бесполезно, ты никогда не признаешь что был неправ.

Вот например сейчас половина твоего поста про мегабайты, но их там нет. Когда я компилирую hello world командой rustc -C opt-level=3 -C lto main.rs я получаю файл размером 1.4M а не 2.3 как у тебя. Откуда у тебя 2.3 не понятно.

Потом делаешь strip и остается 343K. Когда-то раст не вкладывал отладочную инфу в релизные сборки, но потом к людям из раста пришли люди из фаерфокса и сказали что отладочная инфа стандартной библиотеки должна быть всегда в бинаре, так что теперь приходится чистить стрипом.

Из этих 343K, 207K это jemalloc и libunwind, которые не участвуют в LTO потому что собраны без поддержки LTO (почему так я не знаю, но возможно потому что они собираются gcc, а LTO делает llvm). Остается 136К и это уже код на расте. В этих килобайтах находится код который печатает красивые бектрейсы когда вылетает паника или переполняется стек. Почему llvm не может убрать этот код, я не знаю, возможно потому что считает за полезную работу ту инициализацию которая происходит перед входом в main. И возможно парсинг argv может переполнить стек.

Поздравляю, ты показал инклюды.
Судя по всему - у тебя там тупой инклюд.

Между прочим даже в сишке, тупой инклуд ничем не отличается от LTO, и даст тебе точно такую же оптимизацию. У этого метода даже название есть - «Poor man LTO». Разница между ними только в том что заинклудить некоторые части libc нельзя, но если ты все равно динамически линкуешься с glibc то пофигу.

Можешь ли ты показать хотя бы одну оптимизацию, которая сработает при LTO не сработает при инклуде?. Если нет, то половина твоего поста ниочем.

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

Хотя да, был не прав, нашел одну, называется escape analysis

Еще с LTO можно делать более эффективную девиртуализацию.

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

Очень интересно, когда я делаю тупой инклуд в сишке, escape analysis не срабатывает, и код плохой на выходе.

Когда я делаю тупой инклуд на расте, то escape analysis срабатывает, и код хороший на выходе.

С чем это связано пока не знаю.

Еще с LTO можно делать более эффективную девиртуализацию.

Если есть небольшой пример для теста то покажи, интересно проверить как оно себя поведет на расте.

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

Все, разобрался, публичные функции в расте имеют меньшую видимость чем не static функции в сишке, поэтому при тупом инклуде компилятор заметил что функцию никто не использует.

pftBest ★★★★
()
Ответ на: комментарий от pftBest
$ rustc -C opt-level=3 -C lto main.rs
$ ls -sh main
2,2M main
$ rustc --version
rustc 1.19.0 (0ade33941 2017-07-17)
$ strip -d main
$ ls -sh main
376K main

Из этих 343K, 207K это jemalloc и libunwind, которые не участвуют в LTO потому что собраны без поддержки LTO (почему так я не знаю, но возможно потому что они собираются gcc, а LTO делает llvm).

Потому что в расте не лто, а инклюды, не?

Не верно, во-первых про jemalloc и libunwind я бы вообще не заикался - т.к. это первый признак несостоятельности поделки. Почему неверное - далее.

Дальше, в результирующем бинарнике было 40% кода на расте. Откуда он там взялся? При этом там было всё дерьмо, что только можно.

Насколько я понимаю твой принтф - это компилтай-макрос, либо опять мне наврали сектанты? Кстати - они наврали. Я вижу:

<_ZN57_$LT$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$9write_fmt17hc1fab16d24ef7c03E>:
callq  5940 <pthread_mutex_lock@plt>// как я понимаю - это и есть та принципиально новая архитектура? Сильно
callq  20600 <mallocx>
//и подобного дерьма штук 10+.

Дак вот, после lto - ничего там быть, кроме write(«hello»), не должно.

Всё дерьмо, которое ты приписал к «перед входом» - используется после входа в тысячи местах. Хотя этого «после входа» - быть по определению не должно.

Таким образом - либо твоё лто дерьмо, либо раст дерьмо. Третьего не дано.

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

Неважно что дают инклюды - я за тебя уже всё это писал, зачем ты пересказываешь?

Дело в том, что это не лто. Тебе уже дали определение того, что такое лто. И вот раст-лто ему не соответствует.

Точно так же, если я напишу скрипт, который будет тупо всё инклюдить в файл и собирать - я получу тот же результат, но это не будет лто. Хотя раст так и делает.

Можешь ли ты показать хотя бы одну оптимизацию, которая сработает при LTO не сработает при инклуде?. Если нет, то половина твоего поста ниочем.

Выше ты показул ту оптимизацию, которая не сработает. У тебя нет лто и тем самым ты не можешь делать оптимизации в общем контексте для раст и си-кода.

Половина моего поста о том. Я нигде не говорил, что инклюды дают не тоже, что даёт лто. Я лишь говорил о том, что если раст соответствует тому, что пели мне о нём сектанты, то там никак не может быть то, что я вижу. А оно есть.

И если проблема в том, что stdlib раста рантайм параша хуже printf'а из 60годов, то что поделать. Действительно, тут дело будет не в лто. Но это ещё хуже.

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

В свойствах реального мира я где-то ошибся? Нет. Рассказам - я следую? Да. Поэтому какие претензии ко мне?

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

anonymous
()
Ответ на: комментарий от pftBest

Я же уже говорил о фундаментальной разнице между lto и инклюдами. При инклюдах оптимизация происходит в переходном контексте, а в лто в конечном. В рамках того же whole-program контекст так же будет конечным и разницы не будет.

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

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

Есть просто неиспользуемые функции. И их много.

Поэтому это дополнительные доказательства к тому, что они просто осилили сделать примитивный фильтр гранулярности модуля/класса(что атм вообще используется). Потому что даже уровня функции не осилил.

Т.е. если какой-то инлайн ещё можно объяснить чем-то, то как ты объяснишь неиспользуемые функции? Непрямые вызовы? Не вижу такого - может я слепой.

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

https://gist.githubusercontent.com/anonymous/d6a4a0663f1e75ee65c66df0bd325404... - вот тебе дамп

Дизассемблирование раздела .note.ABI-tag:

Дизассемблирование раздела .gnu.hash:

Дизассемблирование раздела .dynstr:

Дизассемблировать данные - это сильно.

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

Ну вдруг на -d скажут, что что-то спрятал - может там какие сикретные технологии.

Ты же вроде то же сектант - иди помоги пацанам найти вызов. Ведь лто-то есть.

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

Ну вдруг на -d скажут, что что-то спрятал

В секции .dynstr, да. Впрочем, даже умных отмазок ожидать от тебя не приходится.

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

В секции .dynstr, да.

Ты несёшь ахинею в расчёте на то, что кто-то на пятизвёдоного идиота посмотрит и поверит в то, что он несёт не ахинею? Умно.

Впрочем, даже умных отмазок ожидать от тебя не приходится.

Отмазок чего? Поподробнее об этом.

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

Указатель на эту функцию находится в какой-нибудь vtable в секции .data Кстати где она у тебя? Никому не нужный .gnu.hash есть, .data нету. Сделай по нормальному objdump -CD main и сразу найдешь что искал.

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

Сделай по нормальному objdump -CD main и сразу найдешь что искал.

Я дал тебе -D, а на C насрать - он ничего не даёт. Ты мне не «найдёшь», а покажи, если нашёл.

Ну и vtable на хелворд - это сильно. Мы точно не про жабку говорим?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.