About smartUpdate:
This call provides the Adapter with a direct pointer to the internal structures related to the item being updated.
If only the item name or any other symbolic reference were available, the Server would have to find the internal structures through some hashmap lookup.
So, smartUpdate saves this operation; the cost of this operation relative to all other stuff done by the Server is difficult to estimate.
The same is not possible with a Remote Adapter, which, when sending an update to the Server, can only supply the item name or a symbolic reference.

About IItemEventListener.Update:
Option b) is suggested, particularly with a Remote Adapter, where, by omitting fields, the data flow towards the Server is reduced.
In fact, the two forms are equivalent, as the Server will interpret missing fields as unchanged fields.
But note that this only applies to MERGE mode (your case) and to COMMAND mode (apart from the "key" and "command" fields).