Ausgabe
Ich würde gerne wissen, was der Leistungsunterschied zwischen diesen beiden Möglichkeiten zum Einfügen von Daten in eine Datenbank ist.
Der Leistungsunterschied, von dem ich spreche, ist die Standardnutzung von Serverressourcen und nicht die Geschwindigkeit, mit der Daten in die Datenbank eingefügt werden.
Im ersten Beispiel füge ich ein Protokoll zu einer Datenbank hinzu, aber das Objekt wird zuerst auf eine lokale Variable gesetzt.
public class LogService : ILogService
{
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;
public LogService(IUnitOfWork unitOfWork, IMapper mapper)
{
_unitOfWork = unitOfWork;
_mapper = mapper;
}
public async Task AddLog(LogViewModel data)
{
var log = _mapper.Map<Log>(data);
_unitOfWork.Logs.Add(log);
await _unitOfWork.Complete();
}
}
im zweiten Beispiel macht die Funktion dasselbe, verwendet aber keine lokale Variable.
public class LogService : ILogService
{
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;
public LogService(IUnitOfWork unitOfWork, IMapper mapper)
{
_unitOfWork = unitOfWork;
_mapper = mapper;
}
public async Task AddLog(LogViewModel data)
{
_unitOfWork.Logs.Add(_mapper.Map<Log>(data));
await _unitOfWork.Complete();
}
}
Ich weiß, dass der zweite Ansatz weniger Code ist, aber gibt es einen tatsächlichen Unterschied in den Ressourcen, die verwendet werden, indem zuerst eine lokale Variable deklariert wird?
Lösung
Absolut kein Unterschied. Null. Nada. Auch der generierte Bytecode ist wahrscheinlich zu 100% identisch.
Lokale Variablen sind Zeiger, die auf einem Stapel vorhanden sind. Argumente für Methodenaufrufe sind Punkte, die auf den Stack geschoben werden. Beachten Sie die Ähnlichkeit?
Wenn Sie glauben, dass es einen Unterschied gibt, geben Sie den Bytecode (eines Release – Builds, nicht eines Debug-Builds) aus und vergleichen Sie ihn. Wenn Sie es immer noch nicht glauben, führen Sie einen Benchmark durch oder profilieren Sie Ihre Anwendung.
Darüber hinaus ist der Datenbankzugriff tausendmal langsamer als alles andere im Speicher ( Latenzzahlen, die jeder Programmierer kennen sollte ):
L2 cache reference 7 ns 14x L1 cache Main memory reference 100 ns Round trip within same datacenter 500,000 ns 500 us
Beantwortet von – knittl
Antwort geprüft von – Dawn Plyler (FixError Volunteer)