目前我正在使用Microsoft Sync Framework来同步数据库。我需要收集Microsoft Sync Framework插入/更新/删除的每条记录的信息,并对此信息执行某些操作。
同步速度可以超过每分钟50.000条记录。这意味着我的附加代码需要非常轻量级,否则会造成巨大的性能损失。
Microsoft Sync Framework为每条记录引发SyncProgress
事件。我订阅了这样的代码:
// Assembly1
SyncProvider.SyncProgress += OnSyncProgress;
// ....
private void OnSyncProgress(object sender, DbSyncProgressEventArgs e)
{
switch (args.Stage)
{
case DbSyncStage.ApplyingInserts:
// MethodCall/Delegate/Action<>/EventHandler<> => HandleInsertedRecordInformation
// Do something with inserted record info
break;
case DbSyncStage.ApplyingUpdates:
// MethodCall/Delegate/Action<>/EventHandler<> => HandleUpdatedRecordInformation
// Do something with updated record info
break;
case DbSyncStage.ApplyingDeletes:
// MethodCall/Delegate/Action<>/EventHandler<> => HandleDeletedRecordInformation
// Do something with deleted record info
break;
}
}
另一个程序集中的其他地方我有三种方法:
// Assembly2
public class SyncInformation
{
public void HandleInsertedRecordInformation(...) {...}
public void HandleUpdatedRecordInformation(...) {...}
public void HandleInsertedRecordInformation(...) {...}
}
Assembly2
引用Assembly1
。所以Assembly1
对于需要处理收集信息的SyncInformation
类的存在一无所知。所以我有以下选项来触发这段代码:
Assembly2
中订阅
1.1。事件处理程序&LT;&GT; public class Assembly2.SyncInformation : Assembly1.ISyncInformation
我知道性能取决于:
我目前不关心SyncInformation
类的实现。我主要关注OnSyncProgress
方法以及如何调用SyncInformation
方法。
所以我的问题是:
OnSyncProgress
中的切换更好的方法? 答案 0 :(得分:9)
同步速度可以超过每分钟50.000条记录。所以这意味着我的附加代码需要非常轻量级,否则会造成巨大的性能损失。
不,它不会。
50k /分钟不是大量的方法调用,除非您需要为每条记录执行数千次此类调用。这种过早优化的臭味。如果我们忽略故意编写错误的代码和每次调用的反射,那么调用方法的 绝对最慢 方式是通过无类型委托DynamicInvoke
,这可以在我的机器上在42ms内完成50k的通话。其他任何内容(类型代理Invoke
,直接callvirt
在类或接口上,dynamic
,静态call
等等甚至都无法衡量(例如:它将是字面意思50k电话0ms。
你最好使用分析器来查看真正重要的内容,IMO。它几乎肯定是“做”代码,而不是管道。