DI: Сколько вводить?

Я пишу свое второе реальное приложение, использующее 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.

Так что же мне не хватает?

Изменились ли тайминги для этих инструкций на более поздних чипах?

Обновлялось ли ядро ​​после того, как книга была напечатана?

Это книга просто неправильно (или показывает упрощенные инструкции)?

Не упустил ли я какой-то другой аспект, связанный с синхронизацией между процессорами, который не удовлетворяет более быстрая инструкция?

6
задан skaffman 19 January 2011 в 08:45
поделиться