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

        }

Bluetooth と WiFi、および上記の他のすべての R.String が各言語で異なるという仮定の下で、次のパフォーマンス/正確性/翻訳の問題が発生します。

1)ctx.getString(R.stringループの前にそれぞれを文字列に割り当てる必要がありますか? 音声データ文字列の最大数は約 30 です。パフォーマンスは考慮する価値がありますか? 将来この質問を読む他の人にとって、考慮すべきしきい値はありますか?

2) (文字列リソースを取得するときに) パターンをコンパイルするためにコンテキストが必要になるため、次のバリエーションは可能ですか?

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

3) 質問 2 に対する答えが「いいえ」であるが、パターンをそのような方法でコンパイルできる場合、それらをコンパイルするか、代わりに比較するために単に String を構築する必要がありますか?

最後の質問は次のとおりです。最大 300 エントリの文字列配列をループ処理しているため、パフォーマンスを完全に忘れてはいけません (理にかなった範囲内で)!?

^ コードを作成するときは、読みやすさとパフォーマンスの間で満足できる中間点を見つけると思いたいのですが、もしパフォーマンスを忘れてしまった場合 (上記のみと、ループのサイズが限られているため)、実際にはいくつかのコードが必要になります。人々はそれが正しいことだと私に保証してくれます!!

よろしくお願いします

4

1 に答える 1

1

ループの前にそれぞれctx.getString(R.string...)を文字列に割り当てる必要がありますか?音声データ文字列の最大数は約30です-では、パフォーマンスは検討する価値がありますか?将来この質問を読む他の人にとって、それが考慮されるべきしきい値はありますか?

はい、文字列が再利用されている場合は、そうでない場合は必要ありません。しきい値はありません。ユースケースに応じて可能な最適化のみがあります。

パターンをコンパイルするためにコンテキストが必要になるので(文字列リソースを取得するとき)、次のバリエーションも可能ですか?

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

いいえ、この方法では使用できません。クラスコンストラクターでパターンを作成してコンパイルすることを検討しました。

質問2の答えが「いいえ」であるが、パターンをそのような方法でコンパイルできる場合は、それらをコンパイルするか、代わりに比較する文字列を作成する必要がありますか?

このような方法でパターンをコンパイルすることはできません。パターン定義内でメソッド呼び出しを文字列として使用することはできません。

答えは次のとおりです。java.util.regex-Pattern.compile()の重要性?

コンパイルは正規表現を解析し、メモリ内の表現を構築します。コンパイルのオーバーヘッドは、一致と比較して重要です。したがって、パターンを繰り返し使用している場合は、コンパイルされたパターンをキャッシュするためのパフォーマンスが向上します。

于 2013-03-01T18:45:13.103 に答える