วิธีเขียนโปรแกรมวน Loop แล้ว CPU ขึ้นไม่ถึง 100%

จากการได้ไปอ่านที่เว็บพี่ไท้มาเกี่ยวกับ วิธีเขียนโปรแกรมวน Loop แล้ว CPU ขึ้นไม่ถึง 100%
แล้วเห็นว่ามีประโยชน์มาก เลยถือโอกาสทดลอง ว่าวิธีนี้จะช่วยได้มากแค่ไหนครับ เลยมา Note เป็นตัวอย่างไว้ครับ
1. แบบธรรมดาให้ loop 1,000,000,000 รอบ

/**
 * File Name : SleepTest.java
 * Created Date : Nov 13, 2009 : 1:34:13 PM
 * Copyright © 2009 www.fun4station.com
 */
package com.fun4station.example;
import java.math.BigDecimal;

/**
 * @Author Supot Saelao
 * @Version 1.0
 */
public class SleepTest {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		BigDecimal amount = new BigDecimal(0);
		for (int i = 0; i < 1000000000; i++) {
			amount = amount.add(new BigDecimal(i));
		}
		System.out.println("Amount : " + amount);
		long end = System.currentTimeMillis();
		System.out.println("Start time : " + start);
		System.out.println("End time : " + end);
		System.out.println("Diff time : " + (end - start));
	}
}

ตัวอย่าง output

cpu100-normal

Amount : 499999999500000000
Start time : 1258094775765
End time : 1258094827484
Diff time : 51719

public static void main(String[] args) throws InterruptedException {
	long start = System.currentTimeMillis();
	BigDecimal amount = new BigDecimal(0);
	for (int i = 0; i < 1000000000; i++) {
		amount = amount.add(new BigDecimal(i));
		if ((i % 1000000) == 0) Thread.sleep(1L);
	}
	System.out.println("Amount : " + amount);
	long end = System.currentTimeMillis();
	System.out.println("Start time : " + start);
	System.out.println("End time : " + end);
	System.out.println("Diff time : " + (end - start));
}

cpu-sleep-1L

Amount : 499999999500000000
Start time : 1258103736703
End time : 1258103792593
Diff time : 55890

3. เพิ่ม Thread.sleep(10L);

cpu-sleep-10L

Amount : 499999999500000000
Start time : 1258104035125
End time : 1258104100031
Diff time : 64906

4. เพิ่ม Thread.sleep(50L);

cpu-sleep-50L

Amount : 499999999500000000
Start time : 1258104215484
End time : 1258104328765
Diff time : 113281

5. เพิ่ม Thread.sleep(100L);

cpu-sleep-100L

Amount : 499999999500000000
Start time : 1258104477906
End time : 1258104658968
Diff time : 181062

6. เพิ่ม Thread.sleep(1000L);

cpu-sleep-1000L

Amount : 499999999500000000
Start time : 1258104761015
End time : 1258105907640
Diff time : 1146625

สรุปผลแบบคร่าวๆ
1. sleep(1L) ช้าไป ประมาณ 07.46% (4,171)
2. sleep(10L) ช้าไป ประมาณ 20.31% (13,187 ms)
3. sleep(50L) ช้าไป ประมาณ 54.34% (61,562 ms)
4. sleep(100L) ช้าไป ประมาณ 71.43% (129,343 ms)
4. sleep(1000L) ช้าไป ประมาณ 95.49% (1,094,906 ms)
1. แสดงว่าลดการใช้ CPU ไปได้ก็จริงแต่ก็ลดความเร็วไปเหมือนกัน หรือว่าผมเองเขียน code ไม่ดีพอก็ได้ครับ
2. จริงๆ ระหว่างที่ทดสอบนั้นผมก็ทำงานอย่างอื่นไปด้วยครับ
ป.ล นอกเรื่อง มีเงินขนาด 499,999,999,500,000,000 คงไม่ต้องมานั่งเขียนโปรแกรมอีก

ข้อมูลจาก
วิธีเขียนโปรแกรมวน Loop แล้ว CPU ขึ้นไม่ถึง 100%
Thread.sleep

  1. No comments yet.

  1. No trackbacks yet.