1
quan01994 17 天前 1
可以使用
APM 。 IOC + AOP 。 静态织入。 |
3
yuhuai 17 天前 1
说实话,如果是测试该用 benchmark.net ,但你现在属于是被你自己给误导了,你是想监控哪些函数执行时间长,这时候应该用 dotTrace 这种工具在压力下进行监测,可以直接按耗时进行排序,再针对性处理
|
4
yuhuai 17 天前 1
附加一下,上面的名称被识别为网址了,实际测试框架地址是这个 https://github.com/dotnet/BenchmarkDotNet
|
5
cxe2v 17 天前 1
我一问 gpt ,代码就出来了,不比在这里问这些网友快?
} protected override object Invoke(MethodInfo targetMethod, object[] args) { // 检查方法是否有 MeasureTimeAttribute if (targetMethod.GetCustomAttribute<MeasureTimeAttribute>() != null) { var stopwatch = Stopwatch.StartNew(); try { // 执行实际方法 return targetMethod.Invoke(_decorated, args); } finally { stopwatch.Stop(); Console.WriteLine($"方法 {targetMethod.Name} 执行耗时: {stopwatch.ElapsedMilliseconds} ms"); } } else { // 没有特性直接调用方法 return targetMethod.Invoke(_decorated, args); } } } 3. 应用到目标类 csharp 复制代码 public interface IExampleService { [MeasureTime] void DoSomething(); void DoOtherThing(); } public class ExampleService : IExampleService { public void DoSomething() { // 模拟耗时操作 System.Threading.Thread.Sleep(100); Console.WriteLine("执行 DoSomething"); } public void DoOtherThing() { Console.WriteLine("执行 DoOtherThing"); } } 4. 使用动态代理包装实例 csharp 复制代码 class Program { static void Main() { var service = MethodInterceptor<IExampleService>.Create(new ExampleService()); service.DoSomething(); // 记录耗时 service.DoOtherThing(); // 不记录耗时 } } |
6
cxe2v 17 天前 1
@cxe2v
1. 定义一个自定义特性 创建一个特性类,用于标记需要记录耗时的方法: csharp 复制代码 [AttributeUsage(AttributeTargets.Method, Inherited = true)] public class MeasureTimeAttribute : Attribute { } 2. 使用动态代理拦截方法调用 通过 AOP (面向切面编程)的方式,例如使用 Castle DynamicProxy 或 DispatchProxy ,拦截方法的执行并记录耗时。 使用 DispatchProxy 示例: csharp 复制代码 using System; using System.Diagnostics; using System.Reflection; public class MethodInterceptor<T> : DispatchProxy { private T _decorated; public static T Create(T decorated) { object proxy = Create<T, MethodInterceptor<T>>(); ((MethodInterceptor<T>)proxy)._decorated = decorated; return (T)proxy; |