Android 在C中如何将控制从字符串委托给一系列函数

Android 在C中如何将控制从字符串委托给一系列函数,android,c,android-ndk,Android,C,Android Ndk,这是我的android应用程序的性能关键部分,我正在使用NDK(c)处理一个大型位图阵列 int blender(const char* blendMode, int c1, int c2, int amount){ int sob, sog, sor, soa, dsr, dsg, dsb, dsa = 0; dsr = Argb_GetRed(c1); dsg = Argb_GetGreen(c1); dsb = Argb_GetBlue(c1);

这是我的android应用程序的性能关键部分,我正在使用NDK(c)处理一个大型位图阵列

int blender(const char* blendMode, int c1, int c2, int amount){

    int sob, sog, sor, soa, dsr, dsg, dsb, dsa = 0;

    dsr = Argb_GetRed(c1);
    dsg = Argb_GetGreen(c1);
    dsb = Argb_GetBlue(c1);
    dsa = Argb_GetAlpha(c1);

    sor = Argb_GetRed(c2);
    sog = Argb_GetGreen(c2);
    sob = Argb_GetBlue(c2);
    soa = Argb_GetAlpha(c2);


    int src_alpha, mix_alpha, dst_alpha;

    src_alpha = soa * ((255 * amount) / 100) >> 8;

    if (!strcmp(blendMode, "normal")) {
            PSD_BLEND_NORMAL(dsr, sor, mix_alpha);
            PSD_BLEND_NORMAL(dsg, sog, mix_alpha);
            PSD_BLEND_NORMAL(dsb, sob, mix_alpha);
    }
    else if (!strcmp(blendMode, "exclusion")) {

            mix_alpha = soa / 255;
            //.... it's not always just the 3 macros

            PSD_BLEND_EXCLUSION(dsr, sor, mix_alpha);
            PSD_BLEND_EXCLUSION(dsg, sog, mix_alpha);
            PSD_BLEND_EXCLUSION(dsb, sob, mix_alpha);
    }

    ~~~~~~~~~ X 20 or so blend modes ~~~~~~~~~~~~
}
目前,它在每个像素上运行这个混合器功能,并进行切换(显然效率低下)

此外,它必须将原始命令作为字符串(来自json,并通过java传递)

我可以想出几种方法来提高效率,但它们都涉及到编写两个巨大的switch语句。我更喜欢使用1个switch语句,或者如果可能的话使用lookup语句


谢谢大家!

问题相当棘手,但我有一个“黑客”的想法

如果“blendMode”名称选择得很好,则只能比较字符串的前两个(或三个)字母。如果有多个字符串具有相同的第一个字母,则可以使用特殊的大小写并比较第一个字母和第三个字母,依此类推

这个技巧会使代码比一直调用strcmp()快得多。此外,内联compare函数也可能有所帮助

下面是一些代码:

/* compares first two letters of the string */
inline int fast_cmp(const char *mode, const char *cmp) {
    return (mode[0] == cmp[0] && mode[1] == cmp[1]) ? 1 : 0;
}

if( fast_cmp(blendMode, "no") ); /* for "normal"    */
if( fast_cmp(blendMode, "ex") ); /* for "exclusion" */
在行动中:

当然,比较可以直接写入if/else语句中,但这可能会让人困惑。这可以通过小而漂亮的宏来解决:

#define FAST_CMP(x, y) x[0] == y[0] && x[1] == y[1]
下面是正在运行的宏:


此宏版本可能是进行比较的最快方式。

您始终可以不传入字符串,而是传入整数函数代码,这样您就可以执行acutal开关(可能会编译为非常快的代码)