0

从一开始就犯了不将我的应用程序构建为对翻译友好的错误,我现在正处于追溯这样做的艰巨过程中......

我的应用程序涉及语音识别,因此语言差异在代码本身中很常见,而不仅仅是在可能更常见的布局和描述中。

因此,我可能比大多数人更关心使用 XML 字符串资源的性能成本,并再次权衡为每种语言编写新代码/类的巨大努力。

这是一个示例类,我希望通过一点想象力可以让您了解我的困惑:

private static Pattern pWIFI = Pattern.compile(".*\\bwifi\\b.*");
private static Pattern pMOBD = Pattern.compile(".*\\bdata\\b.*");
private static Pattern pBLUE = Pattern.compile(".*\\bbluetooth\\b.*");
private static Pattern pAIRPLANE = Pattern.compile(".*\\bairplane\\b.*");
private static Pattern pAEROPLANE = Pattern.compile(".*\\baeroplane\\b.*");


public class MatchingAndReplacingStuff {

        for (String vd : voiceData) {

            vd = vd.toLowerCase(loc).trim();

            if (vd.startsWith(ctx.getString(R.string.KEYBOARD_)) || vd.startsWith(ctx.getString(R.string.KEY_BOARD_))
                    || vd.startsWith(ctx.getString(R.string.KEYBOARDS_))
                    || vd.startsWith(ctx.getString(R.string.KEY_BOARDS_)) || vd.startsWith(ctx.getString(R.string.KEYBORD_))
                    || vd.startsWith(ctx.getString(R.string.KEYBORDS_))) {

                vd = vd.replaceFirst(ctx.getString(R.string.KEYBOARDS_), "");
                vd = vd.replaceFirst(ctx.getString(R.string.KEYBOARD_), "");
                vd = vd.replaceFirst(ctx.getString(R.string.KEY_BOARD_), "");
                vd = vd.replaceFirst(ctx.getString(R.string.KEY_BOARDS_), "");
                vd = vd.replaceFirst(ctx.getString(R.string.KEYBORD_), "");
                vd = vd.replaceFirst(ctx.getString(R.string.KEYBORDS_), "");

                vd = vd.replaceFirst(ctx.getString(R.string.GOOGLE_VOICE_TYPING), ctx.getString(R.string.GOOGLE_SEARCH));
                vd = vd.replaceFirst(ctx.getString(R.string.VOICE_TYPING), ctx.getString(R.string.GOOGLE_SEARCH));
                vd = vd.replaceFirst(ctx.getString(R.string.VOICE_INPUT), ctx.getString(R.string.GOOGLE_SEARCH));
                vd = vd.replaceFirst(ctx.getString(R.string.VOICE_KEYBOARD), ctx.getString(R.string.GOOGLE_SEARCH));
                vd = vd.replaceFirst(ctx.getString(R.string.VOICE_KEYBORD), ctx.getString(R.string.GOOGLE_SEARCH));
                vd = vd.replaceFirst(ctx.getString(R.string.VOICE_KEY_BOARD), ctx.getString(R.string.GOOGLE_SEARCH));

                voiceDataUpdated.add(vd.trim());

                    }
                }

    // loop again and compare Strings in voiceDataUpdated to Patterns compiled above

        }

假设蓝牙和 WiFi 以及上述所有其他 R.String 在每种语言中都不同,我会遇到以下性能/正确性/翻译问题:

1)是否应该ctx.getString(R.string在循环之前将每个都分配给一个字符串?语音数据字符串的最大数量约为 30 - 那么性能是否值得考虑?对于将来阅读这个问题的其他人,是否有一个应该考虑的阈值?

2)作为编译模式需要一个上下文(当获取字符串资源时),下面的变体是否可能?

Pattern.compile(".*\\bctx.getString(R.string.SOMETHING\\b.*"); <-- pseudo code

3)如果问题 2 的答案是否定的,但是 Patterns 可以以这种方式编译,我应该编译它们,还是只构建一个 String 来比较 - 或者甚至不打扰?!

最后一个问题是:当我处理循环最多包含 300 个条目的字符串数组时,我是否应该完全忘记性能(在合理范围内)!?

^ 我喜欢认为在构建我的代码时,我在可读性和性能之间找到了一个快乐的媒介,但是如果我忘记了性能(仅由于上述原因以及我的循环大小有限),我真的需要一些人们向我保证这是正确的做法!

我提前谢谢你

4

1 回答 1

1

是否应该在循环之前将每个ctx.getString(R.string...)都分配给一个字符串?语音数据字符串的最大数量约为 30 - 那么性能是否值得考虑?对于将来阅读这个问题的其他人,是否有一个应该考虑的阈值?

是的,如果您的字符串被重复使用,则没有必要。没有阈值,只能根据您的用例进行优化。

由于编译模式需要一个上下文(当获取字符串资源时),下面的变体是否可能?

Pattern.compile(".*\\bctx.getString(R.string.SOMETHING)\\b.*");

不,您不能以这种方式使用它,我考虑过在类构造函数中创建和编译模式。

如果问题 2 的答案是否定的,但 Patterns 可以以这种方式编译,我应该编译它们,还是只构建一个 String 来比较 - 或者甚至不打扰?!

模式不能以这种方式编译,您不能将方法调用用作模式定义中的字符串。

答案来自:java.util.regex - Pattern.compile() 的重要性?

Compile 解析正则表达式并构建内存中的表示。与匹配相比,编译的开销很大。因此,如果您重复使用某个模式,缓存已编译的模式将获得一些性能。

于 2013-03-01T18:45:13.103 回答