0

私は多くのコンポーネントを備えた大規模な(少なくとも私にとっては)GUIを開発しています。有効化ルールの背後には、非常に複雑なメカニズムがいくつかあります(つまり、他のコンポーネントのステータスに応じて、どのコンポーネントを有効化/無効化する必要があるか)。ユーザーインターフェイス全体を更新するたびに(設定ファイルを読み込んだ後など、それほど頻繁ではありませんが、必要になる場合があります)、すべてのコンポーネントを設定するためにルールセットを確認する必要があります。私が基本的に行うことは次のとおりです。

meaningfulName1.setEnabled(conditionForMeaningfulName1());
meaningfulName2.setEnabled(conditionForMeaningfulName2());
meaningfulName3.setEnabled(conditionForMeaningfulName3());
// etc

代わりに次のことを行うのが理にかなっているのかどうか自問します。

boolean temp = conditionForMeaningfulName1();
if (meaningfulName1.isEnabled != temp) meaningfulName1.setEnabled(temp);
temp = conditionForMeaningfulName2();
if (meaningfulName2.isEnabled != temp) meaningfulName2.setEnabled(temp);
temp = conditionForMeaningfulName3();
if (meaningfulName3.isEnabled != temp) meaningfulName3.setEnabled(temp);
// etc

その背後にある考え方は、状態がすでに目的の状態である場合にフラグを設定しないことでパフォーマンスを節約し、したがってグラフィカルな更新(および関数呼び出し)を節約することです。

これは大規模に意味があると思いますか、それとも時間を節約してコードを読みにくくするだけではありませんか?

4

1 に答える 1

0

Andrew Thompsonのコメントに続いて、私は小さなテストを作成しました。私はプロファイリングなどを使用しませんでした。非常に単純System.currentTimeMillis()です。明らかに最初の数回の実行は無視する必要がありますが、その後は2つの方法に違いはないようです。

import java.awt.GridLayout;
import java.util.Random;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Main {
    public static Vector<int[]> v;
    public static JButton[][] buttons;
    public static int n1 = 100, n2 = 100, N = 50000;

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setLayout(new GridLayout(n1, n2));

        buttons = new JButton[n1][n2];
        for (int i = 0; i < n1; i++) {
            for (int j = 0; j < n2; j++) {
                buttons[i][j] = new JButton(String.format("%d,%d", i, j));
                f.add(buttons[i][j]);
            }
        }
        f.setSize(1024, 768);
        f.setLocationRelativeTo(null);
        f.setVisible(true);

        v = new Vector<int[]>();
        Random r = new Random();
        for (int i = 0; i < N; i++)
            v.add(new int[] {r.nextInt(n1), r.nextInt(n2), r.nextInt(2)});

        for (int i = 0; i < 10; i++) {
            test1();
            test2();
        }
    }

    public static void test1() {
        reset();
        new Thread(new Runnable() {
            @Override
            public void run() {
                long start = System.currentTimeMillis();
                for (int[] test : v) {
                    buttons[test[0]][test[1]].setEnabled(test[2] == 1);
                }
                System.out.println(String.format("Test1   -> took %dms", System.currentTimeMillis() - start));
            }
        }).start();
    }

    public static void test2() {
        reset();
        new Thread(new Runnable() {
            @Override
            public void run() {
                long start = System.currentTimeMillis();
                for (int[] test : v) {
                    if (buttons[test[0]][test[1]].isEnabled() != (test[2] == 1)) buttons[test[0]][test[1]].setEnabled(test[2] == 1);
                }
                System.out.println(String.format("Test2   -> took %dms", System.currentTimeMillis() - start));
            }
        }).start();
    }

    public static void reset() {
        for (int i = 0; i < n1; i++) {
            for (int j = 0; j < n2; j++) {
                buttons[i][j].setEnabled(true);
            }
        }
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {}
    }
}
于 2012-06-01T09:00:13.707 に答える