这个问题可能看起来有点......微不足道,但是自从我上学期开始学习信息技术以来,我无法停止考虑我碰巧面临的任何问题的最佳实施......
现在就是这里,我有一系列midi消息处理函数,但是有些函数只用于修改消息的特殊属性,只有某些消息才有。
例如,处理函数被赋予一个Midi消息,如果消息有一个,它应该修改Note属性。
现在可行的方法是:
现在我想知道哪一个在性能和要编写的代码量方面效率最高。
可能有一本关于这个东西的书,但我不知道从哪里开始寻找^^
此致 Xaser
答案 0 :(得分:1)
换句话说,您正试图解决您没有的问题。编写可以维护的简单易懂的代码。 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;
}
我不知道这有助于你获得你想要的东西,但我想你的问题是相当理论的。无论如何,在性能和代码量方面找到效率最高 ......