Nine MVP's Blog

20/12/2006

Asynchronous VS Synchronous อันไหนจะเร็วกว่า ???

Filed under: Computers and Internet — Nine MVP @ 5:25 pm
คือว่าผมได้ทำทดสอบเกี่ยวกับเรื่องความเร็วของ Web Services  ที่มีการเขียน Process ใน Web Services เป็นแบบ Synchronous กับ แบบ Asynchronous
 
แบบ Synchronous
รายละเอียดใน Web Services   สร้าง Connection ให้ 3 Server 
 
คำสั่ง Insert Into Test Values (‘X’) 1000 ครั้ง   ที่  Server 1  
รอจนกว่า Server 1 เสร็จ
 
คำสั่ง Insert Into Test Values (‘X’) 1000 ครั้ง   ที่  Server 2
รอจนกว่า Server 2 เสร็จ
 
คำสั่ง Insert Into Test Values (‘X’) 1000 ครั้ง   ที่  Server 3
รอจนกว่า Server 3 เสร็จ
 
จบการทำ Process Web Services
 
 
แบบ Asynchronous
รายละเอียดใน Web Services   สร้าง Connection ให้ 3 Server 
 
คำสั่ง Insert Into Test Values (‘X’) 1000 ครั้ง   ที่  Server 1  
ไม่มีการรอให้ทำ Server1 เสร็จทำ Server2 เลย
 
คำสั่ง Insert Into Test Values (‘X’) 1000 ครั้ง   ที่  Server 2 
ไม่มีการรอให้ทำ Server2 เสร็จทำ Server3 เลย
 
คำสั่ง Insert Into Test Values (‘X’) 1000 ครั้ง   ที่  Server 3 
ไม่มีการรอให้ทำ Server3
 
วนลูปรอจนกว่า Server1 , Server2 , Server3 ทำเสร็จจากคำสั่ง .IsComplete
 
ทำเสร็จหมด ก็จบการทำ Process Web Services
 
 
เมื่อเปรียบเทียบเวลาแล้ว  ปรากฏว่า  Synchronous  ดัน  เร็วกว่า Asynchronous 
ซึ่งจริงๆ แล้ว Synchronous น่าจะช้ากว่าด้วยซ้ำ  
 
ผมก็เลยสงสัยว่าจริงๆ แล้ว Asynchronous ดีอย่างไร มาสามารถทำงานได้เร็วกว่าหรือไม่
 
ใครเคยทำการทดสอบเรื่องเวลาการประมวลผล ระหว่าง 2 วิธีนี้บ้าง   รบกวนทีนะครับ
 

DFox
 
 
 

ตอบ :
 
จริง ๆ คุณต้องคิดให้ถูกก่อนนะครับ

การทำงานแบบ Multi-Thread นั้น ใช้ทรัพยากรของเครื่องพอสมควร
ยิ่งคุณแบ่ง Thread ออกมากเท่าไหร่ ทั้ง Memory ทั้ง CPU Time ก็จะถูกแบ่งกระจายออกมาไปมากเท่านั้น
หากงานไม่มีจำนวนมาก ๆ ไม่ได้ใช้เวลาทำงานนานก็ไม่น่าจะใช้งาน Multi-Thread
 
ดังนั้นควรจะใช้ให้ถูกวิธี และลองคิดแบบตั้งสมมติฐาน บนพื้นฐานความจริงกัน บวกกับปัจจัยต่าง ๆ ที่ต้องคำนึงถึง
 
ตัวอย่าง เรากำลังจะเปรียบเทียบ การทำงานแบบเน้นจำนวนงาน เพื่อหาผลลัพธ์ของเวลาที่ทำงานได้ในทั้ง 2 วิธี ต่อไปนี้
 
 
อย่างตัวอย่างของคุณ DFox   เวลาที่ใช้ในแต่ละงานนั้น เป็นเวลาในการทำงานสั้น ๆ จำนวนงานน้อย งานไม่หนัก ไม่ค้างรอผลลัพธ์นาน
 
ถ้างานที่ติดต่อกับ 3 DB แยกกันอยู่ 3 Server
มี 1 task ต่อ 1 DB
มี Process Time ประมาณ 1 วินาที
 
วิธีแบบ synchronous (1 Thread)
    – เวลาที่ใช้ในการ process tasks รวมกันก็ ไม่เกิน 3 วินาที
    – มีการ share memory ด้วยกัน ใช้ environment ของ thread เดียวกัน
    – CPU Time ใช้เต็มที่ 100% ของเวลาที่จัดสรรมาได้จาก OS
 
วิธีแบบ Asynchronous ( 3 Threads)
    – เวลาที่ใช้ในการ Process Tasks รวมกัน ไม่เกิน 1 วินาที
    – เวลาการสร้าง Thread ทั้ง 3 Threads ใช้เวลา x3 เวลา ไม่แน่ใจว่าเท่าไหร่
    – มีการจองเพื่อใช้ Memory เพิ่มขึ้น 1- 2  เท่า ใช้เวลาในการจองพื้นที่ x2 เวลา ไม่แน่ใจว่าเท่าไหร่
    – CPU Time (time slice) ที่ได้มา 100% จะถูกหาร 3 แบ่งเวลาไปให้แต่ละ Thread ใช้ทำงาน 
 
คุณจะเห็นได้ว่าคุณใช้ Asynchronous (Multi-Thread) กับงานนี้ไม่ค่อยเหมาะสมเท่าไหร่
 
 
 
มาลองดูตัวอย่างงานที่ใช้ Asynchronous (Multi-Thread) แล้วน่าจะทำงานได้เหมาะกว่า
 
 
ถ้างานที่ติดต่อกับ 3 DB แยกกันอยู่ 3 Server
มี 20 tasks ต่อ 1 DB
มี Process Time ที่ต้องค้างรอ ต่อ 1 task ประมาณ 5-10 วินาที ( คิดเฉลี่ยที่ 7.5 ละกัน)
 
 
วิธีแบบ synchronous (1 Thread)
    – เวลาที่ใช้ในการ process tasks รวมกันก็ ไม่เกิน 20 tasks  x  3 db x 7.5 วิ = 450 วินาที
    – มีการ share memory ด้วยกัน ใช้ environment ของ thread เดียวกัน
    – CPU Time ใช้เต็มที่ 100% ของเวลาที่จัดสรรมาได้จาก OS
 
วิธีแบบ Asynchronous ( 3 Threads)
    – เวลาที่ใช้ในการ Process Tasks รวมกัน ไม่เกิน 20 tasks x 1(พร้อมกัน) x 7.5 วิ = 150 วินาที

    – เวลาการสร้าง Thread ทั้ง 3 Threads ใช้เวลา x3 ไม่แน่ใจว่าเท่าไหร่
    – มีการจองเพื่อใช้ Memory เพิ่มขึ้น 1- 2  เท่า ใช้เวลาในการจองพื้นที่ x2 เวลา ไม่แน่ใจว่าเท่าไหร่
    – CPU Time (time slice) ที่ได้มา 100% จะถูกหาร 3 แบ่งเวลาไปให้แต่ละ Thread ใช้ทำงาน 

 

จะเห็นได้ว่างานที่มีจำนวนมาก และมีเวลาที่ไม่คงที่ผันเปลี่ยนไปตามค่าปัจจัยต่าง ๆ และมีแนวโน้มว่าจะ long run จริง ๆ แล้ว
ซึ่งคิดว่าน่าจะมีความเหมาะสมที่ใช้ Multi-thread มาช่วยในการทำงาน ซึ่งจะช่วยลดเวลาได้จริงครับ
 
 
 
ยังมีอีกหลายงานที่เราใช้ การทำงานแบบ Asynchronous มาช่วยอีกมากมาย
ทั้งใน User Interface เพื่อแยกการแสดงผล กับ process บางตัวที่ long run เพื่อช่วยให้ มีการตอบสนองการทำงานที่รวดเร็ว ไม่ต้องค้างรอ
เช่น msn รับ msg จากเพื่อนที่คุยมา show ตลอด และเราก็สามารถที่จะคุยโต้ตอบได้ทันทีโดยไม่ต้องรอ เป็นต้น
 
 
ก็ขอให้อ่านทำความเข้าใจ บวกกับทำทดลองให้เกิดความจริง
เพื่อที่จะใช้ technique, feature ของ programming ต่าง ๆ ได้ถูกต้องกับงานครับผม
 
 
ปล. ถ้าว่างเมื่อไหร่จะทำ ตัวอย่างจับเวลามาให้ดูครับ
 

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.

%d bloggers like this: