应用程序翻译字符串资源费用&模式编译

时间:2013-03-01 18:07:40

标签: java android

我犯了一个错误,就是从一开始就没有构建我的应用程序是友好的翻译,我现在正处于追溯的艰难过程中......

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

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

这是一个示例课程,我希望通过一点想象能让你了解我的困境:

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的答案是否定的,但是模式可以用这种方式编译,我应该编译它们,还是只构建一个字符串进行比较 - 或者甚至不打扰?!

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

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

我提前感谢你

1 个答案:

答案 0 :(得分:1)

  

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

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

  

由于需要上下文来编译模式(获取字符串资源时),是否可能会有以下变体?

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

不,你不能这样使用它,我考虑在类构造函数中创建和编译模式。

  

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

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

回答来自:java.util.regex - importance of Pattern.compile()?

  

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