ala*_*ala 3 c# oop performance static
我设计了一个C#控制台应用程序,使用OOP设计合并和拆分大文件(大小约4GB).它涉及读/写xml,平面文件和图像.我有读者和作家的课程.
合并时间约为00:12,而分裂时间超过04:30.然后我通过将输出文件分发到子目录而不是使用单个目录,将分割的性能提高到00:50.
我的老板要求我将所有内容转换为静态过程编程,而不是对象.他说00:12合并比较00:50分裂是不平衡的.他希望通过转换为静态来在00:30分钟完成分割.
现在我知道静态调用更快按照此.但是我不同意所有静态都会更好,因为我必须在方法中使用"ref"和"out"参数.
我的问题是:
ala*_*mar 13
你有没有介绍你的程序?
您应该分析您的代码.对象是快速的,不是最优的代码是死的慢.
优化后,此任务将无论如何都是I/O绑定(这意味着它花费大部分时间等待磁盘获取另一部分数据).
是的,你的老板最好做一些专横的事情,比如打高尔夫球或者玩耍,而不是告诉你关于软件设计的废话.因为你不是想为他打高尔夫球,对吗?
Mar*_*ell 12
实例调用和静态调用之间的区别是如此微不足道,我很乐意下注它与您的性能问题无关.完全没有.是的,静态调用在技术上更快(通过微小的数量),但与您正在执行的所有文件IO相比,这没什么.正如已经说过的那样 - 描述你的代码,并且不要担心这样的事情(过早的优化).最有可能的,瓶颈是收集性能差,也许可以用字典等修复.
时序:
static: 154ms
instance: 156ms
Run Code Online (Sandbox Code Playgroud)
因此超过50M的呼叫有2ms的差异!忘掉它...
基于:
class Program
{
static void Main()
{
StaticMethod(); // JIT
Program p = new Program();
p.InstanceMethod(); // JIT
const int LOOP = 50000000; // 50M
Stopwatch watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++) StaticMethod();
watch.Stop();
Console.WriteLine("static: " + watch.ElapsedMilliseconds + "ms");
watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++) p.InstanceMethod();
watch.Stop();
Console.WriteLine("instance: " + watch.ElapsedMilliseconds + "ms");
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
void InstanceMethod() { }
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
static void StaticMethod() { }
}
Run Code Online (Sandbox Code Playgroud)
编辑:
如果我们假设(例如)我们每20次调用(if (i % 20 == 0) p = new Program();
)创建一个新方法,则度量标准将更改为:
static: 174ms
instance: 873ms
Run Code Online (Sandbox Code Playgroud)
再次 - 远远不足以表明瓶颈,当超过50M的电话时,我们仍然不到一秒钟!
你的任务听起来应该绝对是IO绑定的,而不是CPU绑定的.通过去除适当的OO设计进行微观优化将是疯狂的.无论如何,静态方法和实例方法之间的区别通常是不可测量的小(如果它甚至存在).
正如alamar所说,您应该在继续之前对您的应用进行分析.有一个免费的分析器可以从Microsoft获得,或者您可以使用JetBrains dotTrace分析器.当然还有其他 - 这些是我用过的两个.
正如指示它是IO绑定还是CPU绑定一样,如果在应用程序运行时运行任务管理器,那么该进程需要多少CPU?磁盘是否一直在颠簸?
将大量文件放在目录中会降低对该目录的访问速度,但只有在实际创建或打开文件或列出目录中的文件时才会这样.诚然,我很惊讶它确实产生了很大的不同.但是,无论如何,在目录中拥有200,000个文件听起来相当难以管理.在使用这些文件之后,使用分层方法可能会更好.
为什么你的老板认为合并和拆分应该首先花费相同的时间?