ฉันไม่มีคำตอบทั้งหมด หวังว่าฉันสามารถหลั่งบางแสงกับมัน
เพื่อทำให้งบก่อนหน้าของฉันง่ายขึ้นเกี่ยวกับเธรดของ. NET เพียงแค่รู้ว่า Parallel Library ใช้งานและค่าเริ่มต้น TaskScheduler สำหรับงานใช้ ThreadPool ยิ่งคุณไปในลำดับชั้น (ThreadPool อยู่ที่ด้านล่าง) ยิ่งมีค่าใช้จ่ายมากขึ้นเมื่อคุณสร้างรายการ ค่าใช้จ่ายพิเศษนั้นไม่ได้หมายความว่าจะช้า แต่ก็ดีที่จะรู้ว่ามี ในที่สุดประสิทธิภาพของอัลกอริทึมของคุณในสภาพแวดล้อมแบบมัลติเธรดนั้นมาจากการออกแบบ สิ่งที่ทำงานได้ดีตามลำดับอาจไม่ทำงานพร้อมกัน มีปัจจัยหลายอย่างที่เกี่ยวข้องกับการให้กฎแก่คุณอย่างหนักและรวดเร็วซึ่งพวกเขาเปลี่ยนไปตามสิ่งที่คุณพยายามจะทำ เนื่องจากคุณกำลังติดต่อกับคำขอเครือข่ายฉันจะลองและยกตัวอย่างเล็กน้อย
ให้ฉันบอกว่าฉันไม่เชี่ยวชาญกับซ็อกเก็ตและฉันรู้ว่าไม่มีอะไรเกี่ยวกับ Zeroc-Ice ฉันรู้เกี่ยวกับการทำงานแบบอะซิงโครนัสเล็กน้อยและนี่คือที่ที่จะช่วยคุณได้จริงๆ ถ้าคุณส่งคำขอซิงโครนัสผ่านซ็อกเก็ตเมื่อคุณโทรSocket.Receive()
เธรดของคุณจะบล็อกจนกว่าจะได้รับคำขอ มันไม่ดี เธรดของคุณไม่สามารถทำการร้องขอได้อีกต่อไปตั้งแต่ถูกบล็อค ใช้ Socket.Beginxxxxxx () คำขอ I / O จะทำและใส่ในคิว IRP สำหรับซ็อกเก็ตและด้ายของคุณจะยังคงดำเนินต่อไป ซึ่งหมายความว่าเธรดของคุณสามารถสร้างคำขอได้หลายพันรายการโดยไม่ต้องปิดกั้นเลย!
หากฉันเข้าใจคุณถูกต้องคุณกำลังใช้การโทรผ่าน Zeroc-Ice ในรหัสการทดสอบของคุณไม่ใช่การพยายามเข้าถึงจุดปลาย http จริง ๆ หากเป็นกรณีนี้ฉันสามารถยอมรับได้ว่าฉันไม่รู้ว่า Zeroc-Ice ทำงานอย่างไร ฉันจะอย่างไรก็ตามขอแนะนำดังต่อไปนี้คำแนะนำที่ระบุไว้ที่นี่Consider Asynchronous Method Invocation (AMI)
โดยเฉพาะอย่างยิ่งในส่วนที่: หน้าแสดงสิ่งนี้:
โดยการใช้ AMI ไคลเอนต์คืนเธรดของตัวควบคุมทันทีที่มีการส่งการร้องขอ (หรือถ้าไม่สามารถส่งได้ทันทีถูกเข้าคิว), อนุญาตให้ไคลเอนต์ใช้เธรดนั้นเพื่อทำงานที่มีประโยชน์อื่น ๆ ในเวลาเฉลี่ย .
ซึ่งน่าจะเทียบเท่ากับสิ่งที่ฉันอธิบายข้างต้นโดยใช้. NET ซ็อกเก็ต อาจมีวิธีอื่นในการปรับปรุงประสิทธิภาพเมื่อพยายามส่งข้อความจำนวนมาก แต่ฉันจะเริ่มต้นที่นี่หรือด้วยคำแนะนำอื่น ๆ ที่แสดงอยู่ในหน้านั้น คุณคลุมเครือเกี่ยวกับการออกแบบแอปพลิเคชันของคุณดังนั้นฉันจึงสามารถเจาะจงได้มากกว่าที่ฉันเคยเป็น เพียงจำไว้ว่าอย่าใช้เธรดมากกว่าที่จำเป็นจริงๆเพื่อให้ได้สิ่งที่คุณต้องการมิฉะนั้นคุณอาจพบว่าแอปพลิเคชันของคุณทำงานช้ากว่าที่คุณต้องการ
ตัวอย่างใน pseudocode (พยายามทำให้มันใกล้เคียงกับน้ำแข็งที่สุดเท่าที่จะเป็นไปได้โดยที่ฉันไม่ต้องเรียนรู้จริง):
var iterations = 100000;
for (int i = 0; i < iterations; i++)
{
// The thread blocks here waiting for the response.
// That slows down your loop and you're just wasting
// CPU cycles that could instead be sending/receiving more objects
MyObjectPrx obj = iceComm.stringToProxy("whateverissupposedtogohere");
obj.DoStuff();
}
วิธีที่ดีกว่า:
public interface MyObjectPrx : Ice.ObjectPrx
{
Ice.AsyncResult GetObject(int obj, Ice.AsyncCallback cb, object cookie);
// other functions
}
public static void Finished(Ice.AsyncResult result)
{
MyObjectPrx obj = (MyObjectPrx)result.GetProxy();
obj.DoStuff();
}
static void Main(string[] args)
{
// threaded code...
var iterations = 100000;
for (int i = 0; i < iterations; i++)
{
int num = //whatever
MyObjectPrx prx = //whatever
Ice.AsyncCallback cb = new Ice.AsyncCallback(Finished);
// This function immediately gets called, and the loop continues
// it doesn't wait for a response, it just continually sends out socket
// requests as fast as your CPU can handle them. The response from the
// server will be handled in the callback function when the request
// completes. Hopefully you can see how this is much faster when
// sending sockets. If your server does not use an Async model
// like this, however, it's quite possible that your server won't
// be able to handle the requests
prx.GetObject(num, cb, null);
}
}
โปรดทราบว่ามีเธรดเพิ่มเติม! = ประสิทธิภาพที่ดีขึ้นเมื่อพยายามส่งซ็อกเก็ต (หรือทำสิ่งใด ๆ ) เธรดไม่ได้ใช้เวทมนตร์ในการที่พวกเขาจะแก้ไขปัญหาใด ๆ ที่คุณกำลังทำอยู่โดยอัตโนมัติ ตามหลักแล้วคุณต้องการ 1 เธรดต่อคอร์เว้นแต่ว่าเธรดใช้เวลาส่วนใหญ่ในการรอคอยจากนั้นคุณสามารถพิสูจน์ได้ว่ามีมากขึ้น การรันแต่ละคำร้องขอในเธรดของตนเองเป็นแนวคิดที่ไม่ดีเนื่องจากสวิตช์บริบทจะเกิดขึ้นและสิ้นเปลืองทรัพยากร (หากคุณต้องการเห็นทุกสิ่งที่ฉันเขียนเกี่ยวกับเรื่องนี้ให้คลิกแก้ไขและดูการแก้ไขที่ผ่านมาของโพสต์นี้ฉันลบออกเนื่องจากดูเหมือนว่าจะทำให้เกิดปัญหาหลักในมือเท่านั้น)
คุณสามารถสร้างคำขอเหล่านี้ได้อย่างแน่นอนในเธรดหากคุณต้องการส่งคำขอจำนวนมากต่อวินาที อย่างไรก็ตามอย่าไปลงน้ำด้วยการสร้างเธรด ค้นหาความสมดุลและติดกับมัน คุณจะได้ประสิทธิภาพที่ดีขึ้นหากคุณใช้แบบอะซิงโครนัสกับแบบซิงโครนัส
ฉันหวังว่าจะช่วย