2010-12-14 53 views
1

所以,我有一个C#应用程序,它具有大约4层深的自定义类型层次结构。C#中DSL /自定义类型的工具包?

此分层的存在是为了提供数据验证和更改事件传播的干净实施。

一个例子是: DocumentNameValue -> NameValue - > StringValue -> BaseDataValue

该系统工作正常,但给予所有层间接性,性能冲浪者。绝对而言,这不是一个巨大的打击,但它确实加起来。

为了澄清,性能问题似乎是数据访问发生嵌套调用的结果。

例如,调用DocumentNameValue.setValue("test.doc")将导致层次结构的每一层都在输入上运行特定的验证测试。这些从基地开始并向上移动。一路上也发生了各种各样的事件。该值实际上是“存储”在层次结构的基础上的,如果这有意义的话。

因为所有我真的做的是确定一个类型的严格的等级制度,确实存在一个推荐的方法做任何的:

  1. 变换在此C#代码为“平”高性能等同? (运行时或编译时)
  2. 或者,或许更好,构建一个DSL只会吐出类型/对象的等效列表?

总体目标是双重的:具有特定于我的应用程序问题域的强类型,提供一个干净的地方来放置我的验证规则。

任何人都可以提供一些提示/建议吗?我做这一切都错了吗?

谢谢

+0

您仍然没有给我们任何理由认为层次结构与性能问题有关,甚至根本不存在性能问题。 – 2010-12-15 00:37:36

回答

3

我的第一本能是问你怎么知道这是你的性能损失的原因。你有跑分析器吗?

我的第二个问题是要求一个代码示例。这个分层是通过OOP(继承)反映的吗?

根据我的理解,您使用不同的类型来表示不同的问题 - 这很好。你已经构建了像ViewModel/Model/DataModel这样的标准。


考虑您的意见,我建议你下载蚂蚁性能分析器的审判,并用它来分析执行缓慢;它会精确地告诉你哪些方法花费的时间最长,并且可以让你量化变化的结果。

我不会建议撕裂你的分层方法,除非应用程序非常简单。学习如何清洁地实施分层系统可以在以后得到满足。

+0

是的,速度差异与一个简单的平面实现显而易见。 – nonot1 2010-12-15 00:35:11

+0

@ nonot1:让我们变得真实。只有*无法*你注意到一个方法调用和五个(或者十个,或者你嵌套的很多层)之间的区别。即使在一百万次迭代的紧密循环中也没有。我们正在谈论微秒。 – 2010-12-15 15:56:44

+0

@qstarin事实上,我会重新审视我的测试。也许我犯了一个错误。 – nonot1 2010-12-16 01:53:51

1

该系统工作正常,但给定所有 间接层,性能 冲浪者。绝对而言,这不是一个巨大的命中,但它确实加起来。

可能不是。你很可能需要重新审视这个假设。

这种事情经常发生吗?

不,因为没有必要。创建继承层次结构(与不继承其他类的继承层次结构)并不会对广大庞大而庞大的绝大多数应用程序的性能产生有意义的影响。此外,如果您的项目是受使用继承影响严重的项目,那么您可能已经使用托管语言做出了错误的决定。

+0

请参阅我更新的问题...我认为它会澄清一些事情。 – nonot1 2010-12-15 00:35:54

0

为了澄清,性能问题似乎是由于数据访问发生嵌套调用的结果。例如,调用DocumentNameValue.setValue(“test.doc”)将导致每个层次的层次都对输入运行特定的验证测试。

您已经抽象到最大,因此失去了对数据访问的控制权。无论类型是否平坦,都不会改变sql发布或IO在数据库中的花费。

将数据访问移出抽象,或在每个设置器上承受意想不到的IO成本。懒惰。