Я пишу свое второе реальное приложение, использующее DI. В целом я думаю, что это позволило улучшить дизайн. Но есть запахи кода, которые я не знаю, как решить.
Я предпочитаю использовать инъекцию конструктора и часто замечал, что мне нужно ввести около 5 или более объектов в конструктор. Кажется, их слишком много, возможно, это проблема дизайна, неправильная установка SRP. Но я думаю, что виновато и мое использование DI.
1: lock:
btsl $0, slp
jnc 3
2: testb $1, slp
jne 2
jmp 1
3:
Изначально я думал, что иметь вложенные циклы расточительно, и можно было бы реализовать что-то вроде:
1: lock:
btsl $0, slp
jc 1
, что было бы намного проще. Однако я понимаю, почему они это сделали, поскольку блокировка
влияет на другие процессоры, а время для btsl
больше, чем для простого testb
.
] Единственное, о чем я не мог осознать, так это о последующем снятии блокировки вращения. В книге утверждается, что это приводит к следующему:
lock:
btrl $0, slp
Мой вопрос в основном почему? Мне кажется, что комбинация блокировка / немедленное движение
работает быстрее.
Вы не делаете этого. нет необходимости передавать старое состояние флагу переноса, поскольку, следуя правилу, что ядро не содержит ошибок (предполагается во многих других местах внутри указанного ядра), старое состояние будет равно 1 (вы бы не пытались освободить его, если бы еще не приобрели его).
И mov
намного быстрее, чем btrl
, по крайней мере, на 386.
Так что же мне не хватает?
Изменились ли тайминги для этих инструкций на более поздних чипах?
Обновлялось ли ядро после того, как книга была напечатана?
Это книга просто неправильно (или показывает упрощенные инструкции)?
Не упустил ли я какой-то другой аспект, связанный с синхронизацией между процессорами, который не удовлетворяет более быстрая инструкция?