SaveChanges() blocks the calling thread until the database finishes, while SaveChangesAsync() frees the thread while it waits. The async version returns a Task<int> that you await. Otherwise they do the same work. Both write the tracked changes in one transaction and return the number of entries written.
In a web app, a blocked thread cannot serve other requests, so async gives better scalability under high traffic. In a desktop app it keeps the UI responsive. Async does not make a single save faster.
Always await the call before you use the context again. EF Core does not support two operations running at the same time on one DbContext.
Rewriting in plainer words…
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.