• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Need advice about [NSInputStream read:maxLength:] performance.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Need advice about [NSInputStream read:maxLength:] performance.


  • Subject: Re: Need advice about [NSInputStream read:maxLength:] performance.
  • From: Motti Shneor <email@hidden>
  • Date: Thu, 17 Sep 2015 12:24:38 +0300

Hello again, sorry for my late rply (was in a short holiday) and thanks for the many enlightening remarks. 

After all these ideas, I am still left without an answer to my basic question, so I will clarify.

First, I am rewriting an existing code. My original code works (fine!) with a dynamic C-style ring-buffer, off which I’m parsing and reading (again!) my messages, thus copying the data twice. Once from the CFstream into my ring-buffer, then again off the ring-buffer into another C-buffer that I pass on to some external “media engine”.

As noted by others, such code suffers some disadvantages, among which - the double-copy, multithreading isn’t easy, so there are too many NSLocks involved, and - reading large amounts of data from the stream can create a performance “hickup” as my reading and writing compete over the same thread context.

Now in reply to Jens (thanks again!) the first approach WILL work (I’m finalizing my POC) because I know the prefix will come, and if I only receive 3 bytes, I’ll wait for the next “BytesAvailable” event, read again until I have the size, then continue from there. Every time, either I have enough data to read (till end of message) or the stream will wake me up again with “bytes available”. 

Finally - my real question again: Is there a specific penalty to NSStream’s method read:maxLength: ? If I call it on the average 2-3 times a message, Is this far worse than reading big bulks off the stream, then doing all my book-keeping and copying and locking? I know some networking calls are doing “a trip to the kernel” which is costly to do very frequently. Is read:maxLength: such a method?

Last, several guys mentioned GCDAsyncSocket. What is it? an open-source thing? a system API I’m not aware of?

Thanks again.

On Sep 10, 2015, at 01:30, Jens Alfke <email@hidden> wrote:


On Sep 9, 2015, at 2:07 PM, Motti Shneor <email@hidden> wrote:

I need reading messages off the stream, each prefixed by 4 bytes containing its size. I was wondering if it was advisable to first read just the size (4 bytes) then read the rest of the message, or maybe it was better to have a big buffer into which to “drain” the stream, then parse my messages off the buffer? 

The first approach won’t work, because the amount of data received is unpredictable. For instance you might receive only three bytes, which isn’t enough to parse the data size. Or you might be able to read the data size, but then try to read a 100000-byte message and get only 1500 bytes of it.

The usual approach when parsing data asynchronously from a network stream is to keep a variable-size buffer of unparsed data. When data arrives, you read all of it and append it to the buffer; then you try to parse the data in the buffer. If there’s not enough to parse yet, you give up till there’s more; or if you parse some data, you remove it from the start of the buffer.

So in your case you’d first check whether the buffer has at least four bytes; if so, you look at the length, and check whether that many more bytes are available. If they are, you read the whole message and remove it from the buffer.

An NSMutableData object works well as a buffer, if you’re not too concerned about high performance. The fastest implementation is probably some sort of custom ring buffer.

—Jens

Motti Shneor, 

CEO,  suMac LTD.

Software Development for the Macintosh


Home/Office Address: 34 Emek-Ha-Ella St. Appt.1 Modiin, ISRAEL, 71723

Home/Office Tel/Fax: +972-8-9267730

Home eMail: email@hidden 
Office eMail: email@hidden
Mobile phone: +972-54-3136621

---

ceterum censeo microsoftiem delendam esse

---




 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Macnetworkprog mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Need advice about [NSInputStream read:maxLength:] performance.
      • From: Jens Alfke <email@hidden>
    • Re: Need advice about [NSInputStream read:maxLength:] performance.
      • From: "Quinn \"The Eskimo!\"" <email@hidden>
References: 
 >Need advice about [NSInputStream read:maxLength:] performance. (From: Motti Shneor <email@hidden>)
 >Re: Need advice about [NSInputStream read:maxLength:] performance. (From: Jens Alfke <email@hidden>)

  • Prev by Date: Re: launch agent and firewall
  • Next by Date: Re: Need advice about [NSInputStream read:maxLength:] performance.
  • Previous by thread: Re: Need advice about [NSInputStream read:maxLength:] performance.
  • Next by thread: Re: Need advice about [NSInputStream read:maxLength:] performance.
  • Index(es):
    • Date
    • Thread