Pull to refresh
92
18

Пользователь

Send message
НО разработчики используют TinyGo, в котором сборщик мусора попроще и запускается когда недостаточно места в куче. Если между вызовом proxy_on_memory_allocate и моментом возврата владения в Go нет выделения памяти, то это условно безопасно.

Можно пример, как конкретно выглядит опасный сценарий при использовании go-pointer?

Не уловил, каким образом proxy_on_memory_allocate "превращается" для AssemblyScript
в:


/// Allow host to allocate memory.
export function malloc(size: i32): usize {
  let buffer = new ArrayBuffer(size);
  let ptr = changetype<usize>(buffer);
  return __pin(ptr);
}

?
PS: Видимо, так:


На стороне хоста выполняется поиск malloc, если нет, то ищется proxy_on_memory_allocate
> Примерно 75 тыс. самокатов отправляют сообщения на сервер в среднем раз в минуту. Во время движения частота обращений составляет один раз в 1–5 секунд.

Интересно было бы послушать про «железо», которое стоит за этим — сколько и каких серверов и т.д. Расскажите, по возможности :)
> И тем не менее, я не познал дзена Go, а все больше понимал, что чего-то мне не хватает.

Да, есть такой момент — если надо из программы на Go «выжать» максимум, то надо много читать.

2431 ops - как-то маловато. Да ещё и latency 9.8, странно. А каков общий размер записи, примерно?

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

Интересный вариант. Попробовал так:


go run -gcflags="-l=4 -m -m" concgo.go s > o 2>&1


  • На результаты не повлияло
  • В o пишут:
    .\concgo.go:60:6: cannot inline is_convergent: function too complex: cost 87 exceeds budget 80
  • Т.е. таки проблема с is_convergent не во "вложенности", а в "сложности"?
  • В исходниках пишут:
    making 1 the default and -l disable. Additional levels (beyond -l) may be buggy and
    // are not supported.
  • Вроде нет указаний, что -l=4 можно использовать "в бою"?

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


Сибираюсь "черкнуть" пару статей про обобщенные типы в Go, там этот вопрос будет рассматриваться.

Добавил разделители для удобства. Хотя это уже "подделка данных".

окно, партиция != фрейм окна (опять же правильно ли называть партицию окном — извечный вопрос определения, переведенного с иностранного языка)

Интересно, а почему не использовать терминологию Microsoft?


  • Окно
  • Рамка окна
  • Секция
  • Секционирование?

Очень интересно! А каков профиль нагрузки в плане соотношения чтение/запись и сколько/какого "железа" под эту нагрузку выделено?

6081 RPS (операций в секунду).
которые суммарно были оснащены 636 процессорными ядрами

Выходит, 10 операций в секунду на ядро?

2-2,5 млн транзакций в секунду

А можно подробнее про эти транзакции? Это транзакции на запись или запросы только на чтение тоже включены сюда? Если это все вместе, каково примерно соотношение записи и чтения?

Пример с деструктурирующим присваиванием я бы переписал в таком песочницо-компилируемом виде:


fn main() {

    let (a, b, c, d, e);

    (a, b) = (1, 2);
    [c, .., d, _] = [1, 2, 3, 4, 5];

    struct EF {
        e: i32,
        #[allow(unused)]        
        f: i32,
    }

    EF { e, .. } = EF { e: 5, f: 3 };

    assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
}
(подсказка, мы теперь проверены).

Не уловил, что изменилось — было два смежных ДЦ, оба загорелись, а теперь ситуация какова?

Дом далеко, но он сам по себе большой — больше человека, а значит и Луна большая.

Как быть с тем, что на море эта иллюзия наблюдается тоже, хотя домов в поле зрения нет?


D' < D

Не понял, почему наблюдатель для угла D находится ближе к Солнцу, чем для D'?

Все правильно, все справедливо. Список односвязный, как и показано на первой картинке.


В C++ можно передать кастомный аллокатор, если нет желания использовать дефолтный.

Это можно сделать штатно в Rust, но в разбираемых примерах штатный механизм работы с памятью вообще не задействован. В рамках такого подхода невозможного мало, за исключением:


Вместо этой строки должен быть растовый аналог std::aligned_storageT, а в методе push — perfect forwarding аргументов.

Пробросить параметры конструктора и собрать объект по нужному месту — нет, так нельзя. Даже в кучу поместить, гарантированно минуя стек, можно только в "ночной версии". В ряде случаев компилятор соптимизирует Box::new::(), конечно.


Собственно, как я говорил, если рассматривать Rust как "замену", то это скорее "замена" языка C, чем C++.

Задача была в следующем, мы должны спроектировать нотификейшн систем, который отправлял бы нотификейшены, когда его об этом будут просить сторонние сервисы.

Можно более подробно про условия задачи? Также не очень понятны требования:


  • Notification Service is ext
  • Do not loose data
Просто не очень понятно с чего вы решили что можно просто скопировать код из STD и он заработает.

Я разве написал, что он должен заработать? В цитате этого нет. В цитате есть "Попробуем".


Мы там увидем примерно такое:
public readonly struct Int32
{
private readonly Int32 m_value;
...
}

Тут странно. Я вижу такое:


public readonly struct Int32
{
  private readonly int m_value;
}

И это работает, по крайней мере, тут.

Я лично уже запутался, какие у вас претензии к тому, что box не работает в пользовательсокм коде в стабильной версии Rust?

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

Information

Rating
374-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Software Architect
Lead