Anonymous
ну скажем так, что rps связан с throughput
Anonymous
http://support.loadimpact.com/knowledgebase/articles/1148857-what-are-requests-per-second-rps
Anonymous
даже не над далеко ходить
Маjко
https://en.wikipedia.org/wiki/Throughput
Маjко
Давай без странных сайтиков местячковых контор
Anonymous
как бы rps подходит под это описание
Маjко
Throughput это о данных, а не о реквестах. При размере запроса в 1мб у тебя будет 1ГБ/c throughput и 1000 rps с одним килобайтом те же 1ГБ/с но уже 1000000 rps
Маjко
Я чет не вижу зависимости
Anonymous
согласен
Маjко
Вау
Anonymous
но реквесты связаны с данными
Маjко
Мы уже куда-то движемся
доня.
Дак спрашивай)
ну короче, есть кто-нибудь кто хоть немного шарит в сборщиках мусора? я просто хочу запилить дженерик интерфейс через который можно будет через опции командной строки выбирать стратегию сборки мусора соответственно как я себе это представляю есть трейты GcRuntime<T> и GcBox<T> (первый в общем разруливает поведение gc, второй - обёртка над хранимыми данными) выглядеть они могут допустим как-то так pub trait GcRuntime<T> { type BoxType: GcBox<T>; fn alloc(&mut self, value: T) -> Self::BoxType; } pub trait GcBox<T> { // что сюда пихать я пока не придумал, но на всякий допустим пусть будет отдельный трейт } ну и допустим я для начала хочу в качестве стратегии сборки использовать обычный счётчик ссылок рантайма для него никакого не нужно, GcBox - это std::rc::Rc struct RcRuntime; impl<T> GcRuntime<T> for RcRuntime { type BoxType = Rc<T>; fn alloc(&mut self, value: T) -> Rc<T> { Rc::new(value) } } impl<T> GcBox<T> for Rc<T> {} Ну ок, допустим оно должно работать Теперь есть вот такое вот определение объекта в языке (по сути стыренное): type ObjectRef = Rc<Object>; #[derive(PartialEq, Debug, Clone)] pub struct Object { pub version: u64, pub name: Option<String>, pub content: ObjectContent, pub class: ObjectRef, pub bases: Option<Vec<ObjectRef>>, pub attributes: Option<HashMap<String, ObjectRef>>, } // тут ещё struct ObjectContent и др. Ну вот и теперь пытаюсь переписать на дженериках pub struct Object<O: GcRuntime<Object<O>>> { pub version: u64, pub name: Option<String>, pub content: ObjectContent<O>, pub class: O::BoxType, pub bases: Option<Vec<O::BoxType>>, pub attributes: Option<HashMap<String, O::BoxType>>, } pub enum ObjectContent<O: GcRuntime<Object<O>>> { None, Bool(bool), Int(i64), Float(f64), Str(String), List(Vec<Object<O>>), Tuple(Vec<Object<O>>), Code(CodeObject), Function(Function<O>), NativeFunction(fn(Vec<Object<O>>) -> Object<O>), } pub struct Function<O: GcRuntime<Object<O>>> { name: String, code: CodeObject, closure: Vec<Object<O>>, } // TODO pub struct CodeObject; Воот, оно вроде компилится, но получился какой-то дженерик-адок, и я не уверен что вообще сам подход верен. Может лучше уйти в динамику и использовать какой-нибудь Any вместо BoxType? Или может подход вообще в корне не верен? Может кто-нибудь подсказать кто шарит?
Anonymous
реквест сам по себе содержит данные
Anonymous
и поэтому он связан с пропускной способностью
доня.
ну короче, есть кто-нибудь кто хоть немного шарит в сборщиках мусора? я просто хочу запилить дженерик интерфейс через который можно будет через опции командной строки выбирать стратегию сборки мусора соответственно как я себе это представляю есть трейты GcRuntime<T> и GcBox<T> (первый в общем разруливает поведение gc, второй - обёртка над хранимыми данными) выглядеть они могут допустим как-то так pub trait GcRuntime<T> { type BoxType: GcBox<T>; fn alloc(&mut self, value: T) -> Self::BoxType; } pub trait GcBox<T> { // что сюда пихать я пока не придумал, но на всякий допустим пусть будет отдельный трейт } ну и допустим я для начала хочу в качестве стратегии сборки использовать обычный счётчик ссылок рантайма для него никакого не нужно, GcBox - это std::rc::Rc struct RcRuntime; impl<T> GcRuntime<T> for RcRuntime { type BoxType = Rc<T>; fn alloc(&mut self, value: T) -> Rc<T> { Rc::new(value) } } impl<T> GcBox<T> for Rc<T> {} Ну ок, допустим оно должно работать Теперь есть вот такое вот определение объекта в языке (по сути стыренное): type ObjectRef = Rc<Object>; #[derive(PartialEq, Debug, Clone)] pub struct Object { pub version: u64, pub name: Option<String>, pub content: ObjectContent, pub class: ObjectRef, pub bases: Option<Vec<ObjectRef>>, pub attributes: Option<HashMap<String, ObjectRef>>, } // тут ещё struct ObjectContent и др. Ну вот и теперь пытаюсь переписать на дженериках pub struct Object<O: GcRuntime<Object<O>>> { pub version: u64, pub name: Option<String>, pub content: ObjectContent<O>, pub class: O::BoxType, pub bases: Option<Vec<O::BoxType>>, pub attributes: Option<HashMap<String, O::BoxType>>, } pub enum ObjectContent<O: GcRuntime<Object<O>>> { None, Bool(bool), Int(i64), Float(f64), Str(String), List(Vec<Object<O>>), Tuple(Vec<Object<O>>), Code(CodeObject), Function(Function<O>), NativeFunction(fn(Vec<Object<O>>) -> Object<O>), } pub struct Function<O: GcRuntime<Object<O>>> { name: String, code: CodeObject, closure: Vec<Object<O>>, } // TODO pub struct CodeObject; Воот, оно вроде компилится, но получился какой-то дженерик-адок, и я не уверен что вообще сам подход верен. Может лучше уйти в динамику и использовать какой-нибудь Any вместо BoxType? Или может подход вообще в корне не верен? Может кто-нибудь подсказать кто шарит?
блин, полотно получилось вынести в гист?
Anonymous
ну короче, есть кто-нибудь кто хоть немного шарит в сборщиках мусора? я просто хочу запилить дженерик интерфейс через который можно будет через опции командной строки выбирать стратегию сборки мусора соответственно как я себе это представляю есть трейты GcRuntime<T> и GcBox<T> (первый в общем разруливает поведение gc, второй - обёртка над хранимыми данными) выглядеть они могут допустим как-то так pub trait GcRuntime<T> { type BoxType: GcBox<T>; fn alloc(&mut self, value: T) -> Self::BoxType; } pub trait GcBox<T> { // что сюда пихать я пока не придумал, но на всякий допустим пусть будет отдельный трейт } ну и допустим я для начала хочу в качестве стратегии сборки использовать обычный счётчик ссылок рантайма для него никакого не нужно, GcBox - это std::rc::Rc struct RcRuntime; impl<T> GcRuntime<T> for RcRuntime { type BoxType = Rc<T>; fn alloc(&mut self, value: T) -> Rc<T> { Rc::new(value) } } impl<T> GcBox<T> for Rc<T> {} Ну ок, допустим оно должно работать Теперь есть вот такое вот определение объекта в языке (по сути стыренное): type ObjectRef = Rc<Object>; #[derive(PartialEq, Debug, Clone)] pub struct Object { pub version: u64, pub name: Option<String>, pub content: ObjectContent, pub class: ObjectRef, pub bases: Option<Vec<ObjectRef>>, pub attributes: Option<HashMap<String, ObjectRef>>, } // тут ещё struct ObjectContent и др. Ну вот и теперь пытаюсь переписать на дженериках pub struct Object<O: GcRuntime<Object<O>>> { pub version: u64, pub name: Option<String>, pub content: ObjectContent<O>, pub class: O::BoxType, pub bases: Option<Vec<O::BoxType>>, pub attributes: Option<HashMap<String, O::BoxType>>, } pub enum ObjectContent<O: GcRuntime<Object<O>>> { None, Bool(bool), Int(i64), Float(f64), Str(String), List(Vec<Object<O>>), Tuple(Vec<Object<O>>), Code(CodeObject), Function(Function<O>), NativeFunction(fn(Vec<Object<O>>) -> Object<O>), } pub struct Function<O: GcRuntime<Object<O>>> { name: String, code: CodeObject, closure: Vec<Object<O>>, } // TODO pub struct CodeObject; Воот, оно вроде компилится, но получился какой-то дженерик-адок, и я не уверен что вообще сам подход верен. Может лучше уйти в динамику и использовать какой-нибудь Any вместо BoxType? Или может подход вообще в корне не верен? Может кто-нибудь подсказать кто шарит?
а зачем тебе вообще дженерики?
Маjко
и поэтому он связан с пропускной способностью
Да, в том плане что ты не обработаешь запросов больше. чем может прокачать твой канал, например. Это верхний ораничитель, пока мы в пропускную способность не уперлись, throughput растет вместе с rps
Маjко
Энивей, мы скатываемся в другой срач. Твой сервачок с архитектурой, приятно пахнущей ламповыми девяностыми, ни по throughput ни по rps даже близко не приблизится к правильно написанному асинхронному серверу. И это проблема)
Маjко
блин, полотно получилось вынести в гист?
Давай на плейграунд, там проще
доня.
а зачем тебе вообще дженерики?
ну я же говорю, чтобы можно было в рантайме выбрать стратегию gc соответственно исходя из выбранных опций создавать объекты у которых параметр-тип-gc будет соответствовать той или иной стратегии
доня.
Давай на плейграунд, там проще
блин, у меня просто много файлов, я тогда лучше уж сразу на гитхаб всё вместе залью
Anonymous
Anonymous
он же нужен только для конкарент сборок
Маjко
дык никто не спорит, но 50к протянуть можно
Дык это неэффективное решение как ни крути. Если у тебя железо может вытянуть лям клиентов, а ты только 50к со своим сервером хэндлишь, то чем это не проблема? Это как использовать сортировку пузырьком там, когда есть значительно более эффективные алгоритмы.
Маjко
Ой, блин
Маjко
Заговариваюсь
Маjко
Конечно сортировку
Anonymous
да да, и эт постоянно
Маjко
Линчуй меня за мелкую описку
Anonymous
ты на меня наезжаешь вообще за то, чего не было
Маjко
Не ври
Маjко
Ты уже дважды согласился что было
Маjко
чтоб ты уже отстал
Не ври, после этого ты продолжил дискуссию и утверждение того тезиса, с которым ты согласился
Anonymous
JVM так делает, не?
ага так, но только в случае с jvm gc сильно интегрирован с компилятором
доня.
@mersinvald https://github.com/KolesnichenkoDS/python-vm
Маjко
Уоу
доня.
crates/pygc/src/*.rs, src/object.rs
Маjко
Много
Маjко
Ага
доня.
ага так, но только в случае с jvm gc сильно интегрирован с компилятором
можешь поподробнее рассказать или кинуть статейку какую-нибудь где про это прочитать можно?
Anonymous
JVM так делает, не?
могу посоветовать Шипилева
Anonymous
он как раз сейчас в jvm пилит шенаду
Anonymous
а почитать конечно же gc handbook
Anonymous
можешь поподробнее рассказать или кинуть статейку какую-нибудь где про это прочитать можно?
https://shipilev.net/jvm-anatomy-park/ все что помечено gc скорее всего содержит инфу
Anonymous
кстати, еще интересный вопрос как ты будешь делать safepoints )
Маjко
@KolesnichenkoDS ну вообще у тебя и так GC, чуть чуть динамики погоды не сделают. А в чем вопрос? Со статической диспетчеризацией на дженериках быстрее, но код будет раздут, с динамической чуть чуть оверхэда, но функции в одном экземпляре
Anonymous
с дженериками это вообще не сделать, имхо
Anonymous
вот конкретнее
Anonymous
кстати почитав его, вы поимете что в go обычный cms и он гавно)
Маjко
Все они стопорят мир, энивей
Маjко
Epsilon — лучший GC)
доня.
с дженериками это вообще не сделать, имхо
а есть технические причины, ну кроме раздутости кода? потому что если это в принципе возможно, я бы попробовал сделать на статической, но если это точно невозможно, то и тратить время нет смысла
Маjко
Ты для чего GC делаешь?
Anonymous
у тебя язык интерпритируемый? или ты для раста делаешь?
доня.
хочу python vm реализовать и опережая следующий вопрос - да, понятно что для pet-проекта можно не заморачиваться с небольшим оверхедом из-за динамической диспетчеризации, но я вот хочу сделать прямо максимально _правильно_, спортивного интереса и саморазвития ради так что если технически есть возможность сделать с меньшим оверхедом, хочу постараться так и сделать
Anonymous
ок, ну тут тебе надо будет c jit делать интеграцию точно
Anonymous
интерпретируемый байт-код
у Шипилева есть на твиче видео как он шенаду пилит
доня.
для начала я хочу просто интерпретатор реализовать, а то я и так замахнулся на сложную для меня вещь, а jit - ещё одна вещь в которой надо основательно разбираться но если просто интерпретатор получится сделать, то потом jit было бы круто запилить кстати, вот ты говоришь что нужно делать интеграцию с jit - значит ли это, что какой-нибудь llvm'овский jit заюзать не получится и нужно будет писать свой, или llvm предоставляют какие-нибудь api для этого?
Anonymous
может будет полезно
доня.
у Шипилева есть на твиче видео как он шенаду пилит
за ссылки спасибо большое, читал статейки по реализации gc на rust, но уровень совершенно другой, конечно
Anonymous
и сеифпоинты тож на llvm не сделаны
Anonymous
но эт не значит, что нельзя сделать свою реализацию
Anonymous
почитай еще http://llvm.org/docs/GarbageCollection.html
доня.
так, ладно, я понял надо подтянуть мат. часть а, и на счёт safepoints - когда ты говорил "невозможно на дженериках" ты имел ввиду если реализовывать для Rust а не для отдельного языка?
Anonymous
да, для раст
Anonymous
это все конечно можно сделать, но обычно в таких языках это делается статически
Anonymous
и тесно интегрируют с компилятором
доня.
ну, тем интереснее) всё-таки попробую надеюсь меня хватит