Le 18 juil. 2010 à 11:17, Ryan McGann a écrit :

> 
> On Jul 18, 2010, at 7:42 AM, Rafael Cerioli wrote:
> 
>> Le 18 juil. 2010 à 03:03, Ryan McGann a écrit :
>>> Unfortunately, I can't find the sources at the moment as it was a while 
>>> ago, but there was an interesting discussion about this topic on the 
>>> macnetworkprog mailing list. Apple found in the early days of iPhone 
>>> programming that threads are (in general), a bad idea for networking, and 
>>> it was made worse by the fact that the iPhone has only 1 CPU. Apple's 
>>> resident kernel networking engineers (the guys that would know about 
>>> networking latency the most), as well as the venerable Quinn "the Eskimo" 
>>> from Apple DTS, basically boiled it down to this:
>>>     Rule #1. Networking code is dominated by network latency, not CPU 
>>> cycles.
>>>     Rule #2. Don't use threads for networking  without thoroughly profiling 
>>> your application.
>>> 
>>> Downloading a file, even if it can be done in a single TCP packet (after 
>>> the RTT of the handshake) can take 20-30 milliseconds easily, and that's if 
>>> the server responds instantaneously and no DNS lookup is involved. Your 
>>> application only gets 10 milliseconds of CPU time anyway so it'll sleep 
>>> several times before the file is received, and that's if a bunch of other 
>>> things are true first. 
>>> 
>>> Your application, if well behaved will never notice network latency. On the 
>>> iOS devices, setting up a thread (creating the thread context, scheduling 
>>> it in the kernel and context switching to the new thread) can take a full 
>>> thread quantum. GCD helps but only so much.
>>> 
>>> Now, when SSL gets involved things are murkier. The certificate exchange 
>>> can take 100's of milliseconds and is moderately CPU intensive (compared to 
>>> the network data transfer which is relatively insignificant). It still all 
>>> happens in the background (when using NSStream) and your application should 
>>> get ample CPU time, but if you have several connections at once you could 
>>> find your app getting slowed down.  
>>> 
>>> If, and only if, you find your application is being blocked by threading 
>>> (usually the result of SSL negotiation) then you should think about 
>>> threading your networking. Otherwise, trust the threading model of the 
>>> higher level networking APIs.
>>> 
>> 
>> 
>> Thank you for that! It's seems very accurate!
>> 
>> So, correct me if I'm wrong (I just want to be sure that I got it), you are 
>> saying that if in put my networking code into a thread, then I will lost one 
>> cpu cycle for the thread creation and scheduling, then several other cycles 
>> for nothing to wait until the packet is downloaded (an so on for each packet 
>> transmission).
>> Would it mean that my app will be less responsive because switching between 
>> threads for nothing (is this a performance cost?), or just that my download 
>> will take more time ?
> Anytime you use a thread, you will lose some CPU cycles in creating the 
> thread & waiting for the OS to switch to the new thread to execute. iOS 4 has 
> Grand Central Dispatch which can reduce the cost of this, but on single 
> core/CPU devices, there's still a big cost for something that isn't strictly 
> necessary. The thread will just sit there waiting for packets to arrive, and 
> threads are best used when you know that the thread will be busy most of the 
> time.
> 
> If the OS is busy switching back and forth between your main thread and the 
> networking thread, that's CPU cycles spent in context switching instead of 
> inside your application. The download will take slightly longer (microseconds 
> probably) due to this overhead, but more importantly the CPU will be working 
> harder unnecessarily.
> 
>> Another aspect : would the memory required to run another thread have a 
>> significant impact on my app memory footprint ? (I guess it all depends on 
>> the number of threads?)
> Each thread requires a a certain amount of memory, so yes using another 
> thread will consume more memory on the device. Each thread also consumes 
> kernel resources that are wired down, which is even worse. 
> 
> Not to say all threads are bad. But they don't always make sense, especially 
> in networking.


Thank you, crystal clear now!

Regards,
Rafael_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to