我犯了一个错误,就是从一开始就没有构建我的应用程序是友好的翻译,我现在正处于追溯的艰难过程中......
我的应用程序涉及识别语音,因此语言差异在代码本身中很常见,而不仅仅是布局和描述,这可能更常见。
因此,我可能比大多数人更关心使用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个条目的字符串数组时,我是否应该完全忘记性能(在合理范围内)!
^我喜欢认为在构建我的代码时,我在可读性和性能之间找到了一个愉快的媒介,但是如果我忘记了性能(由于上面的仅仅和我的循环的有限大小),我真的需要一些人向我保证这是正确的做法!!
我提前感谢你
答案 0 :(得分:1)
在循环之前是否应将每个
ctx.getString(R.string...)
分配给一个字符串?语音数据字符串的最大数量大约为30 - 那么性能是否值得考虑?对于将来阅读这个问题的其他人来说,是否有一个应该考虑的门槛?
是的,如果你的字符串被重用,否则就没有必要了。没有阈值,只能根据您的用例进行优化。
由于需要上下文来编译模式(获取字符串资源时),是否可能会有以下变体?
Pattern.compile(".*\\bctx.getString(R.string.SOMETHING)\\b.*");
不,你不能这样使用它,我考虑在类构造函数中创建和编译模式。
如果问题2的答案是否定的,但是模式可以用这种方式编译,我应该编译它们,还是只构建一个字符串进行比较 - 或者甚至不打扰?!
模式无法以这种方式编译,您不能将方法调用用作模式定义中的字符串。
回答来自:java.util.regex - importance of Pattern.compile()?
编译解析正则表达式并构建内存中表示。与匹配相比,编译的开销很大。因此,如果您反复使用模式,则可以获得一些缓存已编译模式的性能。