亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何測試交互式java代碼的速度?

如何測試交互式java代碼的速度?

海綿寶寶撒 2022-11-30 16:12:29
我問題中的重要詞是交互:對于編程競賽(UVa 在線評委),我正在編寫交互式 Java 代碼:它在 System.out 上輸出并等待 System.in 上的響應。我想測試這段代碼的速度,但如果我手動進行交互,我的人類打字技能會減慢執行速度,并且測量結果會有偏差。因此,我想要一個線程/應用程序/腳本/當我的應用程序在 System.out 上寫入時看到的任何東西,然后(這個線程/應用程序/腳本/任何東西)寫一些我的應用程序使用它的 System.in 讀取的東西。我的應用程序應該使用 System.in 和 System.out 進行通信,因為這就是我將其提交給在線法官后的判斷方式。我認為多線程不會完成這項工作,因為 System.in 總是從鍵盤讀取,而不是從另一個線程讀取。import java.util.Scanner;public class Main {    public static void main(final String[] args) {        System.out.println("What now?");        final Scanner scanner = new Scanner(System.in);        final String response = scanner.nextLine();        scanner.close();        System.out.println("Finished: " + response);    }}如何在沒有人在鍵盤上鍵入的情況下運行此代碼?
查看完整描述

4 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

InputStream您可以使用負責處理的自定義實現通過另一個線程發送輸入。我下面的版本也允許用戶輸入。


請注意,此解決方案并不完美,但應該讓您對如何操作有一個粗略的印象。


public static void main(final String[] args) {

    System.out.println("What now?");

    DoubleSourceInputStream inputStream = new DoubleSourceInputStream();

    final Scanner scanner = new Scanner(inputStream);

    new Thread() {


        @Override

        public void run() {

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

                inputStream.addBytes(("do task " + i + "\r\n").getBytes());

            }

            // to signal we are done, otherwise the queue would be polled forever

            inputStream.addBytes(new byte[] { -1 });

        }

    }.start();

    final String response = scanner.nextLine();

    scanner.close();

    System.out.println("Finished: " + response);

}


static class DoubleSourceInputStream extends InputStream {


    BlockingQueue<Byte> buffer = new LinkedBlockingQueue<>();


    @Override

    public int read() throws IOException {

        if (System.in.available() > 0)

            return System.in.read();

        try {

            return buffer.take().intValue();

        }

        catch (InterruptedException e) {

            throw new RuntimeException(e);

        }

    }


    public void addBytes(byte[] bytes) {

        for (byte b : bytes) {

            buffer.offer(Byte.valueOf(b));

        }

    }

}


查看完整回答
反對 回復 2022-11-30
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

與其重新發明輪子,不如使用終端的功能來完成。

您通常使用 運行程序的圖像java -jar program.jar,您現在需要將其運行為java -jar program.jar <input.txt,其中input.txt包含您在交互運行時通常從鍵盤傳遞的所有數據。

這僅在您的程序是可預測的情況下才有效,但不可預測程序的計時結果通常是無用的,除非運行數千次。


查看完整回答
反對 回復 2022-11-30
?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

您的用例肯定可以使用多線程。Java 機器人框架提供了發送擊鍵的機制。參考:這篇文章


查看完整回答
反對 回復 2022-11-30
?
達令說

TA貢獻1821條經驗 獲得超6個贊

使用 Main 類作為引導程序方法,并在對InputStream(輸入)和PrintStream(輸出)進行操作的單獨類中實現被測試的代碼。


import java.util.Scanner;


public class Main {

    public static void main(final String[] args) {

        MyCode code = new MyCode(System.in, System.out);

        code.run();

    }

}

現在您不再局限于System.in為. 從測試引導代碼時,只需將 System.in 和 out 替換為測試代碼寫入和讀取的純流。System.outMyCode


查看完整回答
反對 回復 2022-11-30
  • 4 回答
  • 0 關注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號