Monday, August 09, 2004

Crusoe ภาคต่อ

เอา Crusoe มาทดสอบต่อจากตอนที่แล้ว ซึ่งสรุปได้ว่า
  • โปรแกรมเล็กๆ เช่น พวก Benchmark จะทำงานค่อนข้างเร็วอยู่แล้ว
  • โปรแกรมโตๆจะช้าลงหลายสิบเท่าจนรับไม่ได้ แต่จะทำงานเร็วขึ้นเมื่อเรียกมาทำงานหลายๆครั้ง
  • ถ้า cp โปรแกรมไปอีกไฟล์ มันจะถือว่าเป็นคนละโปรแกรม การทำงานจะช้าลงเหมือนเรียกครั้งแรก
  • ถ้า mv เปลี่ยนชื่อเฉยๆ มันยังรู้ว่าเป็นโปรแกรมเดิม การทำงานจะเร็วเหมือนเดิม
  • ความเร็วที่คำนวณได้ของ Crusoe-600MHz ประมาณอยู่ที่ Celeron 17MHz-440MHz
คราวนี้มาลองแบบอื่นดูบ้าง

java -version

เรียก "java -version" ซึ่งเป็นโปรแกรมค่อนข้างโต
[vuthi@crusoe ~]$ time java -version
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)
2.580u 0.100s 0:04.70 57.0%     0+0k 0+0io 1250pf+0w

[vuthi@crusoe ~]$ time java -version
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)
0.800u 0.070s 0:00.89 97.7%     0+0k 0+0io 1250pf+0w

[vuthi@crusoe ~]$ time java -version
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)
0.720u 0.100s 0:00.83 98.7%     0+0k 0+0io 1250pf+0w

[vuthi@crusoe ~]$ time java -version
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)
0.730u 0.070s 0:00.90 88.8%     0+0k 0+0io 1250pf+0w
ถ้าตัดเวลาในการอ่านข้อมูลจากดิสก์ในครั้งแรกออก ดูเฉพาะเวลา cpu อย่างเดียว จะเห็นว่ามันก็เร็วขึ้นตามลำดับ 2.85 -> 0.8 -> 0.72 วินาที

3000 x5 ครั้ง

เอาโปรแกรมเดิม (bench-3000) (ที่ต้องเรียกมาทำงาน 5 ครั้งจึงจะได้ความเร็วถึงที่สุด) มาแก้ ให้มันวนลูปภายในโปรแกรม 5 ครั้งเลย ไม่ต้องกลับมาที่ shell แล้วเรียกโปรแกรมใหม่
  struct timeval t1, t2;

  for(k=0;k<5;k++) {
    gettimeofday(&t1, 0);
  for(i=0;i<2500;i++) {
    /* 2500 Repeat 3,000 times */
    x += 1.0/j - 1.0/(j+2); j+=4;
    ...
    x += 1.0/j - 1.0/(j+2); j+=4;
  }
  printf("Pi %lf\n", x * 4.0);
  gettimeofday(&t2, 0);
  double seconds = t2.tv_sec-t1.tv_sec+(t2.tv_usec-t1.tv_usec)/1000000.0;
  printf("%3d: %lf\n", k, seconds);
  }
ได้ผลดังนี้
[vuthi@crusoe Samples]$ time ./huibench-3000-x5
Pi 3.141593
  0: 37.064915
Pi 3.141593
  1: 22.283039
Pi 3.141593
  2: 7.737691
Pi 3.141593
  3: 2.117348
Pi 3.141593
  4: 2.130969
71.100u 0.020s 1:11.38 99.6%    0+0k 0+0io 121pf+0w

[vuthi@crusoe Samples]$ time ./huibench-3000-x5
Pi 3.141593
  0: 2.151069
Pi 3.141593
  1: 2.117074
Pi 3.141593
  2: 2.119463
Pi 3.141593
  3: 2.135293
Pi 3.141593
  4: 2.121363
10.650u 0.010s 0:10.66 100.0%   0+0k 0+0io 121pf+0w

[vuthi@crusoe Samples]$ time ./huibench-3000
Pi 3.141593
37.100u 0.010s 0:37.10 100.0%   0+0k 0+0io 118pf+0w
ผลลัพท์เหมือนกับเรียกโปรแกรม 5 ครั้งคราวที่แล้ว แสดงว่า จะคำนวณซ้ำ 5 ครั้งในโปรแกรมหรือนอกโปรแกรมมันก็ไม่ต่างกัน ยังไม่แน่ใจว่ามันใช้หลักอะไรดูว่าเป็นโปรแกรมเดิมหรือเปล่า เพราะปิดท้ายด้วย huibench-3000 ซึ่งเนื้อหาลูปในสุดเหมือนกันเด๊ะ มันช้าเหมือนไม่เคยเห็น code แบบนี้มาก่อน

9000 x5 ครั้ง

คราวนี้ลองแก้ให้โปรแกรมโตขึ้นอีก จาก 3000 บรรทัดเป็น 9000 บรรทัด ให้คำนวณ 5 ครั้งต่อการเรียกโปรแกรม 1 ครั้งเหมือนกรณีข้างต้น
[vuthi@crusoe Samples]$ time ./huibench-9000-x5
Pi 3.141593
  0: 43.415493
Pi 3.141593
  1: 42.009296
Pi 3.141593
  2: 40.617840
Pi 3.141593
  3: 39.259297
Pi 3.141593
  4: 37.943564
203.270u 0.020s 3:23.28 100.0%  0+0k 0+0io 181pf+0w

[vuthi@crusoe Samples]$ time ./huibench-9000-x5
Pi 3.141593
  0: 36.670147
Pi 3.141593
  1: 35.442751
Pi 3.141593
  2: 34.162813
Pi 3.141593
  3: 32.618100
Pi 3.141593
  4: 31.064975
169.960u 0.020s 2:49.97 100.0%  0+0k 0+0io 181pf+0w

[vuthi@crusoe Samples]$ time ./huibench-9000-x5
Pi 3.141593
  0: 29.595852
Pi 3.141593
  1: 28.137752
Pi 3.141593
  2: 26.773090
Pi 3.141593
  3: 25.302357
Pi 3.141593
  4: 23.722087
133.540u 0.000s 2:13.54 100.0%  0+0k 0+0io 181pf+0w

[vuthi@crusoe Samples]$ time ./huibench-9000-x5
Pi 3.141593
  0: 22.213004
Pi 3.141593
  1: 20.673250
Pi 3.141593
  2: 19.106657
Pi 3.141593
  3: 17.578757
Pi 3.141593
  4: 16.042067
95.620u 0.010s 1:35.62 100.0%   0+0k 0+0io 181pf+0w

[vuthi@crusoe Samples]$ time ./huibench-9000-x5
Pi 3.141593
  0: 14.432032
Pi 3.141593
  1: 12.813109
Pi 3.141593
  2: 11.156587
Pi 3.141593
  3: 9.513688
Pi 3.141593
  4: 7.843944
55.760u 0.000s 0:55.76 100.0%   0+0k 0+0io 181pf+0w

[vuthi@crusoe Samples]$ time ./huibench-9000-x5
Pi 3.141593
  0: 6.180543
Pi 3.141593
  1: 4.490356
Pi 3.141593
  2: 2.964806
Pi 3.141593
  3: 2.491097
Pi 3.141593
  4: 2.523717
18.670u 0.000s 0:18.66 100.0%   0+0k 0+0io 181pf+0w

[vuthi@crusoe Samples]$ time ./huibench-9000-x5
Pi 3.141593
  0: 2.498555
Pi 3.141593
  1: 2.489768
Pi 3.141593
  2: 2.470934
Pi 3.141593
  3: 2.471768
Pi 3.141593
  4: 2.471174
12.400u 0.020s 0:12.41 100.0%   0+0k 0+0io 181pf+0w
การคำนวณแต่ละครั้งเร็วขึ้นเรื่อยๆ (ประมาณ 1.5 วินาทีต่อครั้ง) โดยดูเหมือนโปรแกรมที่โตขึ้นทำให้มันเรียนรู้ได้ช้าลง แต่ในที่สุดก็คำนวณเสร็จที่เวลา 2 วินาทีกว่า เหมือนกรณีของ 3000 บรรทัด หลังจากที่เรียกโปรแกรมไป 6 ครั้ง (คำนวณ 30 ครั้ง)

Crusoe มันก็สนุกดีเหมือนกันแฮะ โปรแกรมเดียวกัน เดี๋ยวช้า เดี๋ยวเร็ว

No comments: