как я создаю большой вектор в clojure

Жесткий действительно! В моем (C++) модульные тесты я разломал это на несколько категорий вроде используемого шаблона параллелизма:

  1. Модульные тесты на классы, которые работают в единственном потоке и не ориентированы на многопотоковое исполнение - легкий, протестируйте, как обычно.

  2. Модульные тесты на объекты Монитора (те, которые выполняют синхронизированные методы в потоке вызывающих сторон управления), которые представляют синхронизируемый общедоступный API - инстанцируют нескольких ложных потоков, которые осуществляют API. Создайте сценарии, которые осуществляют внутренние условия пассивного объекта. Включайте один более длинный запускающий тест, который в основном бьет heck из него от нескольких потоков в течение длительного периода времени. Это является ненаучным, я знаю, но это действительно создает атмосферу доверия.

  3. Модульные тесты на Активные объекты (те, которые инкапсулируют их собственный поток или потоки управления) - подобный № 2 выше с изменениями в зависимости от дизайна класса. Общедоступный API может блокироваться или не блокироваться, вызывающие стороны могут получить фьючерсы, данные могут прибыть в очереди или должны быть исключены из очереди. Существует много комбинаций, возможных здесь; белое поле далеко. Все еще требует, чтобы несколько ложных потоков выполнили вызовы к объекту под тестом.

Как в стороне:

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

6
задан Arthur Ulfeldt 20 July 2009 в 20:37
поделиться

3 ответа

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

(vec (repeat 1042 nil))

Кажется, эти ценности не создаются лениво.

14
ответ дан 8 December 2019 в 03:40
поделиться

Если вам нужно что-то не ленивое, но позволяющее избежать накладных расходов, вы можете сделать:

(vec (make-array Object 1024))

Обратите внимание, assoc не изменяет вектор, он возвращает новый вектор. при изменении одного из значений. Векторы неизменны. Ваш код никогда не будет работать так, как было опубликовано.

5
ответ дан 8 December 2019 в 03:40
поделиться
(apply vector (take 1024 (repeat nil)))

... ленив

4
ответ дан 8 December 2019 в 03:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: