確かなデータがあるとは思えないので、いくつかの考えを追加します。
まず、DI (またはその他の SOLID 原則) を使用しないのは、TDD を実行するのに役立つからです。逆に、TDD を使用するのは設計に役立つためです。これは通常、これらの原則に従うコードを取得することを意味します。
インターフェイスを使用する理由については別の問題です。 https://stackoverflow.com/questions/667139/what-is-the-purpose-of-interfacesを参照してください。
クラスに多くの異なることをさせると、コードが乱雑になることに同意していただけると思います。したがって、私はあなたがすでに SRP に取り組んでいると仮定しています。
特定のことを行うさまざまなクラスがあるため、それらを関連付ける方法が必要です。それらをクラス (つまり、コンストラクター) 内で関連付けると、特定のバージョンのクラスを使用する多くのコードが得られます。これは、システムに変更を加えることが困難になることを意味します。
システムを変更する必要があります。これはソフトウェア開発の事実です。特定の余分な機能を追加しないことについて YAGNI に電話することはできますが、システムを変更する必要がないということについては電話できません。私の場合、毎週スプリントを行っているので、これは非常に重要なことです。
コードを使用して構成を行う DI フレームワークを使用しています。非常に小さなコード構成で、多くの異なるリレーションを接続します。したがって、インターフェイスと具象クラスの議論を取り除けば、実際には入力を節約できますが、その逆ではありません。また、具体的なクラスがコンストラクターにある場合は、それを自動的にフックして (構成する必要はありません)、残りの関係を構築します。また、一部のオブジェクトのライフタイムを制御することもできます。特に、オブジェクトをシングルトンとして構成し、常に単一のインスタンスを渡すことができます。
また、これらのプラクティスを使用するだけでは、オーバーヘッドが増えるわけではないことに注意してください。それらを初めて使用することがオーバーヘッドの原因です (学習プロセス + 場合によってはマインドセットの変化のため)。
結論: 高速化するために、コンストラクター呼び出しをあちこちに配置する必要はありません。