处理具有不同属性的消息的最佳方法

时间:2013-11-18 19:15:18

标签: c# c++-cli messaging midi

这个问题可能看起来有点......微不足道,但是自从我上学期开始学习信息技术以来,我无法停止考虑我碰巧面临的任何问题的最佳实施......

现在就是这里,我有一系列midi消息处理函数,但是有些函数只用于修改消息的特殊属性,只有某些消息才有。

例如,处理函数被赋予一个Midi消息,如果消息有一个,它应该修改Note属性。

现在可行的方法是:

  • 实施INote接口。
  • 为每种消息类型实现一个类,并比较适用于具有注释属性的类
  • 实施“HasNote”属性
  • 只需修改类的Note属性,如果不存在此类属性,则抛出异常。
  • 恰当的其他几种可能性。

现在我想知道哪一个在性能和要编写的代码量方面效率最高。

可能有一本关于这个东西的书,但我不知道从哪里开始寻找^^

此致 Xaser

2 个答案:

答案 0 :(得分:1)

MIDI是在20世纪80年代早期设计的,设计用于当时可用的那种机器。它仅以31.25 kbaud发送数据,至少比网卡慢1500倍。 20世纪80年代的机器比现在的桌面机器慢了大约1000倍。 Midi消息速率大约是每秒1000个,您的机器可以在单个midi消息上执行5 百万指令而不会落后。

换句话说,您正试图解决您没有的问题。编写可以维护的简单易懂的代码。 midi消息状态字节上的switch()语句可以正常工作。当然得到一本书,亚马逊有plenty to choose from

答案 1 :(得分:1)

有点晚了,但有些想法(因为我最近遇到了处理midi)。您提供处理功能的原始数据的粒度可能比表示(消息继承结构,属性等)更重要。所以你可以问自己:我应该在到达时分解/解析每个数据包(例如,不同类型的不同消息,......)或者我应该将原始数据包装在通用消息对象中,并且只在提取单个字段时neccessary?嗯,这取决于你的处理是什么样的,但是 - 正如Hans Passant已经说过的那样,在midi的情况下根本不会产生性能影响。

然而,有时候“思考”一个完全满足设计需求的解决方案是有意义的。特别是如果你以后计划从中构建一个更抽象的解决方案。

关于midi,这是另一个技巧(改编自C#5 in a Nutshell [Albahari]中的一个例子),用于数据表示。只要midi消息以1字节大小的部分进行分段,您就可以构建一个结构(以下代码为C#),其中完整消息使用4字节整数,不同消息属性使用重叠字节字段。以此为例,可以优化字段访问:

[StructLayout(LayoutKind.Explicit)]
struct NativeMidi 
{
    [FieldOffset(0)]
    public uint PackedMsg;

    [FieldOffset(0)]
    public byte ChannelAndStatus;
    [FieldOffset(1)]
    public byte Value1;
    [FieldOffset(2)]
    public byte Value2;
}

我不知道这有助于你获得你想要的东西,但我想你的问题是相当理论的。无论如何,在性能和代码量方面找到效率最高 ......