2010-09-12 63 views
21

Tôi cần một vài tính toán cpu và bộ nhớ chuyên sâu có thể thực hiện một cách dễ dàng mà tôi có thể viết bằng java cho một bộ lập lịch trình thử nghiệm.Ví dụ tính toán CPU chuyên sâu?

Chúng sẽ hơi tốn thời gian, nhưng quan trọng hơn là tiêu thụ tài nguyên.

Bất kỳ ý tưởng nào?

+0

@Martin: mọi người đều biết đó là 42. –

+0

@Martin: "42 + 0 =?" Nghe có vẻ giống như một đặt cược tốt :) Xin lỗi vì đã gửi câu hỏi của meursault, tôi thấy nó quá buồn cười để chống lại. Tôi sẽ dừng lại và kiểm tra triệu con khỉ và máy đánh chữ của tôi trong tầng hầm. –

Trả lời

21

Một vài ví dụ đơn giản của CPU-chuyên sâu các nhiệm vụ:

  • tìm kiếm số nguyên tố (bao gồm rất nhiều bộ phận BigInteger)
  • tính giai thừa lớn ví dụ 2000! ((liên quan đến nhiều phép nhân BigInteger)
  • nhiều tính toán Math.tan() (điều này rất thú vị vì Math.tan là bản địa, vì vậy bạn đang sử dụng hai ngăn xếp cuộc gọi: một cho cuộc gọi Java, một cho cuộc gọi C).
6

Nhân hai ma trận. Các ma trận phải rất lớn và được lưu trữ trên đĩa.

Tìm kiếm chuỗi. Hoặc, lập chỉ mục một tài liệu khổng lồ (phát hiện và đếm sự xuất hiện của mỗi từ hoặc chuỗi ký tự) Ví dụ, bạn có thể lập chỉ mục tất cả các mã định danh trong mã nguồn của một dự án phần mềm lớn.

Tính pi.

Xoay ma trận 2D hoặc hình ảnh.

Nén một số tệp lớn.

...

+1

Hoặc chỉ cần thêm vào StringBuilder trong vòng forloop trong N giây. – tidwall

+0

điều này cũng sẽ liên quan đến rất nhiều IO, vì vậy tiêu thụ tài nguyên sẽ được IO dữ dội hơn là CPU cường độ cao – vikkyhacks

4

Ok đây không phải là Java, nhưng điều này được dựa trên thuật toán Dhrystone benchmark thấy here. Việc triển khai thuật toán này có thể cung cấp cho bạn ý tưởng về cách thực hiện. Liên kết here chứa các nguồn tới C/C++ và Assembler để có được điểm chuẩn.

1
  1. Official RSA Challenge
  2. không chính thức RSA Challenge -.. Grab một số bản mã mà bạn muốn đọc trong bản rõ Hãy để máy tính ở đó Nếu u sử dụng một thuật toán ngẫu nhiên, có một nhỏ nhưng khác không cơ hội mà bạn sẽ thành công.
6

Thử nghiệm ngâm CPU cho PDP-11 là tan(atan(tan(atan(...))) vv Hoạt động của FPU khá khó khăn và cũng là ngăn xếp và đăng ký.

3
  • Tính thứ n hạn của loạt fibonacci, trong đó n là lớn hơn 70. (tốn thời gian)

  • thừa Tính số lượng lớn. (tiêu tốn thời gian)

  • Tìm tất cả có thể đường dẫn giữa hai nút, trong biểu đồ. (tiêu thụ bộ nhớ)

+0

Tôi đã thử với Java BigInteger và thậm chí tính số 5000 trong dãy Fibonacci đã được thực hiện rất nhanh chóng. –

+0

@iamcreasy Bạn có thể đăng một số mã làm việc để làm điều đó (trên ideone có thể)? Tôi tò mò làm thế nào nó xảy ra quá nhanh. – Rushil

+0

Chắc chắn, [ở đây] (http://pastebin.com/RaqQ9rwm). Hãy cho tôi biết nếu tôi đã phạm sai lầm. –

0

Tôi đã rối tung với ưu tiên Chủ đề trong Java và sử dụng mã bên dưới. Dường như giữ cho CPU đủ bận để ưu tiên luồng tạo ra sự khác biệt.

@Test 
public void testCreateMultipleThreadsWithDifferentPriorities() throws Exception { 
    class MyRunnable implements Runnable { 
     @Override 
     public void run() { 
      for (int i=0; i<1_000_000; i++) { 
       double d = tan(atan(tan(atan(tan(atan(tan(atan(tan(atan(123456789.123456789)))))))))); 
       cbrt(d); 
      } 
      LOGGER.debug("I am {}, and I have finished", Thread.currentThread().getName()); 
     } 
    } 
    final int NUMBER_OF_THREADS = 32; 
    List<Thread> threadList = new ArrayList<Thread>(NUMBER_OF_THREADS); 
    for (int i=1; i<=NUMBER_OF_THREADS; i++) { 
     Thread t = new Thread(new MyRunnable()); 
     if (i == NUMBER_OF_THREADS) { 
      // Last thread gets MAX_PRIORITY 
      t.setPriority(Thread.MAX_PRIORITY); 
      t.setName("T-" + i + "-MAX_PRIORITY"); 
     } else { 
      // All other threads get MIN_PRIORITY 
      t.setPriority(Thread.MIN_PRIORITY); 
      t.setName("T-" + i); 
     } 
     threadList.add(t); 
    } 

    threadList.forEach(t->t.start()); 
    for (Thread t : threadList) { 
     t.join(); 
    } 
} 
Các vấn đề liên quan