Forwarded from Kim-Cat (Cosplay, Design, Model) (Ким-Кэт (ArkStranger))
Друзья, серьёзная просьба к вам.
Посоветуйте, пожалуйста, психолога или психотерапевта в Петербурге, который работает с мужчинами со следующими проблемами:
* Эмоциональная закрытость;
* Недоверие к людям и их отторжение;
* Тревожность;
* Стремление угодить другим, и при этом неспособность радовать себя;
* Низкая самооценка;
* Нарциссические черты характера;
* Вспыльчивость.
На этот раз я твёрдо намерен себе помочь. Писать сюда: @dakmmail
Заранее большое спасибо.
Посоветуйте, пожалуйста, психолога или психотерапевта в Петербурге, который работает с мужчинами со следующими проблемами:
* Эмоциональная закрытость;
* Недоверие к людям и их отторжение;
* Тревожность;
* Стремление угодить другим, и при этом неспособность радовать себя;
* Низкая самооценка;
* Нарциссические черты характера;
* Вспыльчивость.
На этот раз я твёрдо намерен себе помочь. Писать сюда: @dakmmail
Заранее большое спасибо.
🤣17🫡12🤝3🎉2🤡2😢1
#prog #article
How single-iteration InstCombine improves LLVM compile time
Проход оптимизации InstCombine в LLVM является сборником peephole оптимизаций — то есть оптимизаций, которые ищут короткие конкретные паттерны в исходном коде и заменяют на эквивалентные, но более эффективные. Например, замена
Исторически InstCombine работал до достижения неподвижной точки — то есть прогонял всю пачку трансформаций снова и снова, пока трансформации не переставали вносить изменения в код. Однако InstCombine — довольно дорогой проход оптимизации, и на практике на этот цикл уходило довольно много времени компиляции. Более того, замеры показали, что этот цикл избыточен: в подавляющем большинстве случаев (>99,9%) одной итерации было достаточно.
Статья рассказывает о том, как InstCombine перевели на одну итерацию — вместе с информацией о технических деталях, которые пришлось поменять попутно. Это изменение в итоге привело к снижению времени компиляции на 4%.
Как отмечает автор, это — исключительный случай, ибо зачастую в компиляторах нет очевидных медленных мест и ускорение одного прохода оптимизации обычно слабо сказывается на скорости работы компилятора в целом.
(thanks @itpgchannel)
How single-iteration InstCombine improves LLVM compile time
Проход оптимизации InstCombine в LLVM является сборником peephole оптимизаций — то есть оптимизаций, которые ищут короткие конкретные паттерны в исходном коде и заменяют на эквивалентные, но более эффективные. Например, замена
x / 2 на x >> 1, или замена x + y == y на x == 0.Исторически InstCombine работал до достижения неподвижной точки — то есть прогонял всю пачку трансформаций снова и снова, пока трансформации не переставали вносить изменения в код. Однако InstCombine — довольно дорогой проход оптимизации, и на практике на этот цикл уходило довольно много времени компиляции. Более того, замеры показали, что этот цикл избыточен: в подавляющем большинстве случаев (>99,9%) одной итерации было достаточно.
Статья рассказывает о том, как InstCombine перевели на одну итерацию — вместе с информацией о технических деталях, которые пришлось поменять попутно. Это изменение в итоге привело к снижению времени компиляции на 4%.
Как отмечает автор, это — исключительный случай, ибо зачастую в компиляторах нет очевидных медленных мест и ускорение одного прохода оптимизации обычно слабо сказывается на скорости работы компилятора в целом.
(thanks @itpgchannel)
👍8
Ты исправляешь предупреждения компилятора, чтобы сделать свой код лучше.
Я исправляю предупреждения компилятора, чтобы избавиться от назойливых подчёркиваний в IDE.
Мы не одинаковы.
Я исправляю предупреждения компилятора, чтобы избавиться от назойливых подчёркиваний в IDE.
Мы не одинаковы.
👍24❤1
#prog #c #shell #menacingopensource
🥜 Pnut: A Self-Compiling C Transpiler Targeting Human-Readable POSIX Shell
⬇️
🥜 Pnut: A Self-Compiling C Transpiler Targeting Human-Readable POSIX Shell
int sum(int* a, int len) {
int i, sum = 0;
for (i = 0; i < len; i += 1) {
sum += a[i];
}
return sum;
}⬇️
#!/bin/sh
set -e -u
: $((sum = i = len = a = 0))
_sum() { let a $2; let len $3
let i; let sum
sum=0
i=0
while [ $i -lt $len ] ; do
: $((sum += _$((a + i))))
: $((i += 1))
done
: $(($1 = sum))
endlet $1 sum i len a
}
# Runtime library
# Local variables
__=0
__SP=0
let() { # $1: variable name, $2: value (optional)
: $((__SP += 1)) $((__$__SP=$1)) # Push
: $(($1=${2-0})) # Init
}
endlet() { # $1: return variable
# $2...: function local variables
__ret=$1 # Don't overwrite return value
: $((__tmp = $__ret))
while [ $# -ge 2 ]; do
: $(($2 = __$__SP)) $((__SP -= 1)); # Pop
shift;
done
: $(($__ret=__tmp)) # Restore return value
}
GitHub
GitHub - udem-dlteam/pnut: 🥜 A Self-Compiling C Transpiler Targeting Human-Readable POSIX Shell
🥜 A Self-Compiling C Transpiler Targeting Human-Readable POSIX Shell - udem-dlteam/pnut
🤯14😁1
Блог*
Это просто цирк какой-то. Яндекс.Такси переименовали в Яндекс Go и запихнули туда функционал Яндекс.{Еды, Лавки, Драйв}. Причём почему-то это преподносится как что-то хорошее. Интересно, как быстро они распилят обратно, сопроводив это той же самой риторикой…
😒🤚 Яндекс Go
😏👉 Яндекс Rust
😏👉 Яндекс Rust
😁17🤣9👍7🌚3🤮1
#prog #rust #rustreleasenotes
Вышла версия Rust 1.80.0! Как всегда, тут только избранные моменты, а остальное в детальных заметках о релизе.
(rust playground всё ещё не обновился, так что примеры кода проверяйте локально или на nightly)
▪️В паттернах теперь можно использовать диапазоны с исключающей верхней границей. Пример из блога:
▪️Важное изменение для unsafe кода: теперь на произвольных выровненных указателях разрешены чтение и запись значений типов нулевого размера, включая null. Также на всех указателях (и null) разрешены смещения на 0, и offset_from всегда разрешён для указателей с одинаковым адресом из одной аллокации.
▪️В релизе Rust 1.75.0 были даны гарантии на раскладку в памяти
Например,
⚠️ std теперь может уронить программу в большем числе случаев. Смотри ниже:
🔸Помните, в Rust 1.63 добавили типы для IO safety? Так вот, в отладочной сборке (читай, при
🔸Также в отладочной сборке
🔸Тип fmt::Error должен использоваться лишь для индикации того, что запись в нижележащий приёмник информации более невозможна, но не для передачи ошибок в самом процессе форматирования как таковом. В частности, в силу того, что
🔸PathBuf::set_extension теперь паникует, если новое расширение содержит разделитель пути файловой системы.
▪️Добавлены типы LazyCell и LazyLock, которыеимитируют автора этого канала позволяют хранить значение, вычисляемое по требованию при помощи предоставленной при создании функции. Значит ли это, что теперь можно выкинуть once_cell? Отнюдь. У этих типов не стабилизированы методы для получения содержимого без форсирования их вычисления, и по непонятным причинам оба не дают никакого способа (даже нестабильного) получить мутабельный доступ к содержимому.
Более того, получения значения из
Вышла версия Rust 1.80.0! Как всегда, тут только избранные моменты, а остальное в детальных заметках о релизе.
(rust playground всё ещё не обновился, так что примеры кода проверяйте локально или на nightly)
▪️В паттернах теперь можно использовать диапазоны с исключающей верхней границей. Пример из блога:
fn size_prefix(n: u32) -> &'static str {
const K: u32 = 10u32.pow(3);
const M: u32 = 10u32.pow(6);
const G: u32 = 10u32.pow(9);
match n {
..K => "",
K..M => "k",
M..G => "M",
G.. => "G",
}
}▪️Важное изменение для unsafe кода: теперь на произвольных выровненных указателях разрешены чтение и запись значений типов нулевого размера, включая null. Также на всех указателях (и null) разрешены смещения на 0, и offset_from всегда разрешён для указателей с одинаковым адресом из одной аллокации.
▪️В релизе Rust 1.75.0 были даны гарантии на раскладку в памяти
Option для некоторых типов т. н. "null pointer optimization" (название не вполне верное, поскольку не только у ссылок есть ниша на битовом паттерне из одних нулевых битов). В этом релизе схожие гарантии дали и для раскладки Result. Именно, Result имеет такое же представление в памяти, как и аналогичный Option с одним из типовых параметров, если для этого параметра есть гарантии "null pointer optimization" при оборачивании в Option, а второй типовый параметр является типом нулевого размера с выравниванием 1, без полей и без атрибута #[non_exhaustive].Например,
Result<NonZero<i32>, ()> и Result<(), NonZero<i32>> теперь имеют такие же размер, выравнивание и гарантии ABI, как и Option<NonZero<i32>>.⚠️ std теперь может уронить программу в большем числе случаев. Смотри ниже:
🔸Помните, в Rust 1.63 добавили типы для IO safety? Так вот, в отладочной сборке (читай, при
#[cfg(debug_assertions)]) дроп OwnedFd теперь прерывает работу процесса, если соответствующий файловый дескриптор уже закрыт.🔸Также в отладочной сборке
unchecked_* арифметические методы паникуют при нарушении предусловий их безопасного использования.🔸Тип fmt::Error должен использоваться лишь для индикации того, что запись в нижележащий приёмник информации более невозможна, но не для передачи ошибок в самом процессе форматирования как таковом. В частности, в силу того, что
String может расширяться по мере нужды, форматирование в String считается операцией, которая не может вернуть ошибку. Для того, чтобы усилить соблюдение этого контракта, теперь форматирование в новый String паникует при ошибке из реализации одного из fmt методов, а форматирование в IO-ресурсы (стандартный вывод, например) паникует, если ошибку вернул метод форматирования, но не запись данных в IO-ресурс.🔸PathBuf::set_extension теперь паникует, если новое расширение содержит разделитель пути файловой системы.
▪️Добавлены типы LazyCell и LazyLock, которые
Более того, получения значения из
LazyLock блокирует вызывающий поток, если значение ещё не вычислено или в процессе вычисления. Как правило, это то, что нужно для корректной логики, но в некоторых случаях можно или даже нужно позволить сразу нескольким потокам вычислять значение одновременно и установить в итоге то, которое было у самого первого потока, завершившего работу (например, время старта первого рабочего потока в тредпуле). Для таких юзкейсов в once_cell есть типы из модуля race. Помимо логического отличия, эти типы за счёт отказа от блокировки потоков могут быть использованы на платформах без операционной системы.👍8😁1