<font size=2 face="sans-serif">Thanks for the clarifications.</font><br><font size=2 face="sans-serif">More comments below.</font><br><br><tt><font size=2>dabrahams@apple.com wrote on 01/24/2017 05:50:59 PM:<br><br>&gt; Maybe it wasn't clear from the document, but the intention is that<br>&gt; String would be able to use any model of Unicode as a backing store,
and<br>&gt; that you could easily build unsafe models of Unicode... but also that<br>&gt; you could use your unsafe model of Unicode directly, in string-ish
ways.<br></font></tt><br><tt><font size=2>I see. If I understand correctly, it will be possible
for instance to implement an unsafe model of Unicode with a UInt8 code
unit and a maxLengthOfEncodedScalar equal to 1 by only keeping the 8 lowest
bits of Unicode scalars.</font></tt><br><br><br><br><tt><font size=2>&gt; &gt; A lot of machine processing of strings continues
to deal with 8-bit <br>&gt; &gt; quantities (even 7-bit quantities, not UTF-8).<br>&gt; &gt; Swift strings are not very good at that. I see progress in the
manifesto <br>&gt; &gt; but nothing to really close the performance gap with C.<br>&gt; &gt; That's where &quot;unsafe&quot; mechanisms could come into play.<br>&gt; <br>&gt; extendedASCII is supposed to address that. &nbsp;Given a smart enough<br>&gt; optimizer, it should be possible to become competitive with C even<br>&gt; without using unsafe constructs. &nbsp;However, we recognize the importance<br>&gt; of being able to squeeze out that last bit of performance by dropping<br>&gt; down to unsafe storage.<br></font></tt><br><tt><font size=2>I doubt a 32-bit encoding can bridge the performance
gap with C in particular because wire protocols will continue to favor
compact encodings. Incoming strings will have to be expanded to the extendedASCII
representation before processing and probably compacted afterwards. So
while this may address the needs of computationally intensive string processing
tasks, this does not help simple parsing tasks on simple strings.</font></tt><br><br><br><tt><font size=2><br>&gt; &gt; To guarantee Unicode correctness, a C string must be validated
or <br>&gt; &gt; transformed to be considered a Swift string.<br>&gt; <br>&gt; Not really. &nbsp;You can do error-correction on the fly. &nbsp;However,
I think<br>&gt; pre-validation is often worthwhile because once you know something
is<br>&gt; valid it's much cheaper to decode correctly (especially for UTF-8).<br></font></tt><br><tt><font size=2>Sure. Eager vs. lazy validation is a valuable distinction,
but what I am after here is side-stepping validation altogether. I understand
now that user-defined encodings will make side-stepping validation possible.</font></tt><br><br><br><tt><font size=2><br>&gt; &gt; If I understand the C String interop section correctly, in Swift
4,<br>&gt; &gt; this should not force a copy, but traversing the string is still<br>&gt; &gt; required. &nbsp;<br>&gt; <br>&gt; *What* should not force a copy?</font></tt><br><br><tt><font size=2>I would like to have a constructor that takes a pointer
to a null-terminated sequence of bytes (or a sequence of bytes and a length)
and turns it into a Swift string without allocation of a new backing store
for the string and without copying the bytes in the sequence from one place
in memory to another. I understand this may require the programmer to handle
memory management for the backing store.</font></tt><br><br><br><br><tt><font size=2>&gt; &gt; I hope I am correct about the no-copy thing,
and I would also like to<br>&gt; &gt; permit promoting C strings to Swift strings without validation.
&nbsp;This<br>&gt; &gt; is obviously unsafe in general, but I know my strings... and
I care<br>&gt; &gt; about performance. ;)<br>&gt; <br>&gt; We intend to support that use-case. &nbsp;That's part of the reason
for the<br>&gt; ValidUTF8 and ValidUTF16 encodings you see here:<br>&gt; </font></tt><a href="https://github.com/apple/swift/blob/unicode-rethink/stdlib/public/"><tt><font size=2>https://github.com/apple/swift/blob/unicode-rethink/stdlib/public/</font></tt></a><tt><font size=2><br>&gt; core/Unicode2.swift#L598<br>&gt; and here:<br>&gt; </font></tt><a href="https://github.com/apple/swift/blob/unicode-rethink/stdlib/public/"><tt><font size=2>https://github.com/apple/swift/blob/unicode-rethink/stdlib/public/</font></tt></a><tt><font size=2><br>&gt; core/Unicode2.swift#L862<br></font></tt><br><tt><font size=2>OK</font></tt><br><br><br><tt><font size=2><br>&gt; &gt; More importantly, it is not possible to mutate bytes in a Swift
string<br>&gt; &gt; at will. &nbsp;Again it makes sense from the point of view of
always<br>&gt; &gt; correct Unicode sequences. &nbsp;But it does not for machine
processing of<br>&gt; &gt; C strings with C-like performance. &nbsp;Today, I can cheat using
a<br>&gt; &gt; &quot;_public&quot; API for this, i.e., myString._core. &nbsp;_baseAddress!.
&nbsp;This<br>&gt; &gt; should be doable from an official &quot;unsafe&quot; API.<br>&gt; <br>&gt; We intend to support that use-case.<br>&gt; <br>&gt; &gt; Memory safety is also at play here, as well as ownership. &nbsp;A
proper<br>&gt; &gt; API could guarantee the backing store is writable for instance,
that<br>&gt; &gt; it is not shared. &nbsp;A memory-safe but not unicode-safe API
could do<br>&gt; &gt; bounds checks.<br>&gt; &gt;<br>&gt; &gt; While low-level C string processing can be done using unsafe
memory<br>&gt; &gt; buffers with performance, the lack of bridging with &quot;real&quot;
Swift<br>&gt; &gt; strings kills the deal. &nbsp;No literals syntax (or costly coercions),<br>&gt; &gt; none of the many useful string APIs.<br>&gt; &gt;<br>&gt; &gt; To illustrate these points here is a simple experiment: code
written<br>&gt; &gt; to synthesize an http date string from a bunch of integers. &nbsp;There
are<br>&gt; &gt; four versions of the code going from nice high-level Swift code
to<br>&gt; &gt; low-level C-like code. &nbsp;(Some of this code is also about
avoiding ARC<br>&gt; &gt; overheads, and string interpolation overheads, hence the four<br>&gt; &gt; versions.)<br>&gt; &gt;<br>&gt; &gt; On my macbook pro (swiftc -O), the performance is as follows:<br>&gt; &gt;<br>&gt; &gt; interpolation + func: &nbsp;2.303032365s<br>&gt; &gt; interpolation + array: 1.224858418s<br>&gt; &gt; append: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.918512377s<br>&gt; &gt; memcpy: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.182104674s<br>&gt; &gt;<br>&gt; &gt; While the benchmarking could be done more carefully, I think
the main<br>&gt; &gt; observation is valid. &nbsp;The nice code is more than 10x slower
than the<br>&gt; &gt; C-like code. &nbsp;Moreover, the ugly-but-still-valid-Swift code
is still<br>&gt; &gt; about 5x slower than the C like code. &nbsp;For some applications,
e.g. web<br>&gt; &gt; servers, this kind of numbers matter...<br>&gt; &gt;<br>&gt; &gt; Some of the proposed improvements would help with this, e.g.,
small<br>&gt; &gt; strings optimization, and maybe changes to the concatenation<br>&gt; &gt; semantics. &nbsp;But it seems to me that a big performance gap
will remain.<br>&gt; &gt; (Concatenation even with strncat is significantly slower than
memcpy<br>&gt; &gt; for fixed-size strings.)<br>&gt; &gt;<br>&gt; &gt; I believe there is a need and an opportunity for a fast &quot;less
safe&quot;<br>&gt; &gt; String API. &nbsp;I hope it will be on the roadmap soon.<br>&gt; <br>&gt; I think it's already in the roadmap...the one that's in my head. &nbsp;If
you<br>&gt; want to submit a PR with amendments to the manifesto, that'd be great.<br>&gt; Also thanks very much for the example below; we'll definitely<br>&gt; be referring to it as we proceed forward.<br></font></tt><br><tt><font size=2>Here is a gist for the example code:</font></tt><br><a href=https://gist.github.com/tardieu/b6a9c4d53d56d089c58089ba8f6274b5><tt><font size=2 color=blue>https://gist.github.com/tardieu/b6a9c4d53d56d089c58089ba8f6274b5</font></tt></a><br><br><tt><font size=2>I can sketch key elements of an unsafe String API
and some motivating arguments in a pull request. Is this what you are asking
for?</font></tt><br><br><tt><font size=2>Best,</font></tt><br><br><tt><font size=2>Olivier</font></tt><BR>