Ignat
строку в цикле аллоцировать, конечно, так себе идея
Денис
подскажите, как можно такое сократить? impl Future<Item = impl Stream<Item = (), Error = io::Error>, Error = io::Error> + Send (это возвращаемый тип во многих функциях)
KosBeg
строку в цикле аллоцировать, конечно, так себе идея
это упрощеный вариант код -, там цикл, строка 1 раз аллоцируется, а потом от трех до пяти format. хотя так как я юзаю format ТОЛЬКО для конкатенации - то это уже не правильно, нужно что-то другое.
Αλεχ
охуеть
Αλεχ
Αλεχ
это безо всяких плагинов и анализаторов, из коробки
KosBeg
не аналогичный
опа, это мне уже нравится)
kalloc
это что?
պլհկ
тебе сказали write! юзать
Αλεχ
это что?
мне идеешка сразу сказала, что я мудак потому что константу руками написал
պլհկ
format! тоже аллоцируеет
Αλεχ
обычно это всякие анализаторы ловят
Αλεχ
а тут прям из коробки
պլհկ
а если там только инты, то вообще можно https://docs.rs/itoa/0.4.2/itoa/
KosBeg
не, там и строки и числа - u8 и u32, без float'ов
Денис
Трейт MuhFuture : Future<...> и blanket impl.
если я сделаю trait IoFuture: Future<Error = io::Error> + Send {}, то impl IoFuture<Item = impl ...> выдаёт мне "wrong number of type arguments: expected 0, found 1"
Денис
если я сделаю trait IoFuture<T>: Future<Item = T, Error = io::Error> + Send, то не смогу делать вложенный impl trait :(
պլհկ
а чо, алиасы с impl trait не работают?
red75prime
@KosBerg "вот аналогичный(как по мне) код на сях - " и как там длинная-длинная строка умудряется влезть в буфер размером 200 байт?
Денис
а чо, алиасы с impl trait не работают?
"type aliases cannot be used for traits" :(
KosBeg
@KosBerg "вот аналогичный(как по мне) код на сях - " и как там длинная-длинная строка умудряется влезть в буфер размером 200 байт?
во первых snprintf безопасный, я явно указываю, что писать в буфер не больше 255 байт. во вторых я думал что си каждый раз создаёт новый буфер размером 256 байт, а не пишет в тот же. раст же каждый раз аллоцирует строку :D
Berkus
си каждый раз создаёт новый буфер ааа
Денис
вот бы побенчмаркать код на си, не зная сей
պլհկ
не зная сей ебу гусей
Loo
не зная сей ебу гусей
Ебать ты кислотный
Loo
Berkus
не, ну технически sub esp, 264 это конечно "аллокация"
-__-
если я сделаю trait IoFuture: Future<Error = io::Error> + Send {}, то impl IoFuture<Item = impl ...> выдаёт мне "wrong number of type arguments: expected 0, found 1"
Я что-то такое имел в виду https://play.rust-lang.org/?gist=1782f8b0ff59db0750a2361ad711fcb0&version=stable&mode=debug&edition=2015. Но не уверен, что это будет работать, лол.
red75prime
@KosBeg А что сишный код вообще должен делать? _tmp не инициализирован. snprintf пробегает по мусору в памяти до первого NUL, и добавляет " -> 123" если ещё есть место. Так и было задумано?
KosBeg
бля, я конечно же знал что я ебанутый, но не столько же!
KosBeg
😂😂😂 ладно, проехали.
red75prime
Может мне интересно аналогичный код на расте написать
Денис
бля, я конечно же знал что я ебанутый, но не столько же!
шит хэппэнс, всё в порядке) давай просто сойдёмся, что лично для тебя раст более эффективен, чем си, просто потому что на расте ты понимаешь, что пишешь )
red75prime
@KosBeg тогда: https://play.rust-lang.org/?gist=a3cabd76d1b548e8e4541c84ec45703e&version=stable&mode=release&edition=2015
KosBeg
спасибо большущее, это явно то что мне нужно.
Loo
red75prime
ну это ж не strcat, никуда он не пробегает )
Там же snprintf читает из того же буфера куда и пишет.
Berkus
Berkus
он тупо пишет в buf до buf + size - 1
red75prime
snprintf(_tmp, 256, "%s -> %d", _tmp, 123);
Berkus
ы
Berkus
лоль
red75prime
Откуда он %s берёт?
Berkus
мне кажется это ub
Berkus
ну или точнее, очень изощренный способ стрелять в ногу тех кто идет после тебя это мейнтейнить
Berkus
си-стайл
KosBeg
Откуда он %s берёт?
строкой тут выступает буфер _tmp, но по началу он пустой, точнее трешовые байты в стеке
red75prime
не помню, может UB, a может и ID
Berkus
ну технически не должно быть UB, все определено что происходит, а вот чтение неинициализированной памяти - ub
kitsu
Оно, конечно, не по теме чата, но завтра вечером буду лайв-кодить call-by-name lambda-machine на Rust: https://youtu.be/gqTFQxwcYDw Заходите поржать, потому что Rust я буду учить по ходу дела! 😂 Ну, и если есть чат по Rust - закиньте туда, пусть тоже посмеются. 😊 Стрим будет на русском - прошу понять и простить...
Anonymous
Так что от быстрее.
Anonymous
Я когда-то в белом случае на это наткнулся.
Anonymous
Сейчас.
KosBeg
кто быстрее? формат или снпринтф?
Anonymous
Короч прогнал очень глупый тест
Anonymous
int main(int argc , char ** argv) { int i = 10000000; while (i > 0) { printf("%d\n", i); i -= 1; } return 0; }
Anonymous
fn main() { let mut i = 10_000_000; while i > 0 { println!("{}", i); i -= 1; } }
Anonymous
в сях так тоже можно
Anonymous
угадай, какие результаты
Anonymous
разделять нулики
Anonymous
может gcc выкинул printf?
Anonymous
конпелил с -O3
Anonymous
ето си $ time ./a.out >/dev/null 1.58user 0.00system 0:01.58elapsed 99%CPU (0avgtext+0avgdata 1172maxresident)k 0inputs+0outputs (0major+59minor)pagefaults 0swaps
Anonymous
ето руст $ time ./main >/dev/null 0.52user 0.16system 0:00.69elapsed 99%CPU (0avgtext+0avgdata 6136maxresident)k 0inputs+0outputs (0major+95minor)pagefaults 0swaps
Anonymous
Тогда я ещё не знал, почему, но терпеть знаю.
Berkus
угадай, какие результаты
дай ка я подумаю, на захват консольного мьютекса ушло больше всего времени, так?