

1から100万までの数字から素数を取り出すプログラムを作成したのですが、処理する時間を短縮するため搭載されているプロセッサを可能な限り使いたいと考えております。

`int core = Runtime.getRuntime().availableProcessors();`
を使えば実現できそうなのですが、どう組み込んだらいいのかがわかりません。参考になるプログラムやサイトなどを教えていただけないでしょうか。

[code]

    public class primenumber{
        public static void main(String[] args) {
    
            int u=0;
    
            long startTime = 0;
            long estimatedTime = 0;
    
            System.out.println("Prime number counting started");
            startTime = System.nanoTime(); 
    
            r:
            for(int i=2;i<=100000;i++){
                for(int j=2;j<i;j++){
                    if(i%j==0)continue r;
                }
                u++;
                System.out.print(i+" ");
            }
    
            estimatedTime = System.nanoTime() - startTime;
            System.out.println("Started time:"+startTime);
            System.out.println("Complete. Time:"+estimatedTime);
            System.out.println("Number of prime number:"+u);
    
        }
    }
    
[/code]


CC BY-SA 4.0
2020-10-11T12:28:16.573
71107
2020-12-02T13:06:05.347
2020-10-11T16:28:48.957
3060
34781
question
java
プロセッサの並行処理を用いて、プログラムの処理時間を短縮したい


素数を判定するメソッドをつくって、

[code]

    static boolean isPrime(int number) {
        if(number <= 2)
            return number == 2;
        else
            return (number % 2) != 0
                    && IntStream.rangeClosed(3, (int) Math.sqrt(number))
                            .filter(n -> n % 2 != 0)
                            .noneMatch(n -> (number % n == 0));
    }
    
[/code]

Stream APIで呼び出せば、自動的に並列化されて処理時間を短縮できるはずです。

[code]

    IntStream.range(1, 100000).parallel().filter(primenumber::isPrime)
        .forEach(i -> System.out.print(i + " "));
    
[/code]

順序を保証したい場合は、`.parallel()`を取り除いてください。

私の手元で計測した結果では、処理時間が約3秒から約0.4秒に短縮されました。


CC BY-SA 4.0
2020-10-12T01:27:44.290
71115
2020-12-02T13:06:05.347
2020-12-02T13:06:05.347
21092
21092
71107
answer