On Fri, May 31, 2013 at 3:18 PM, Darin Adler <da...@apple.com> wrote:
> On May 31, 2013, at 1:57 PM, Brendan Long <s...@brendanlong.com> wrote:
>> I hope this isn't a stupid question, but I can't find any references to what 
>> the difference between AtomicString and String is.
>
> WTF::AtomicString is a class that has four differences from the normal 
> WTF::String class:
>
> 1) It’s more expensive to create a new atomic string than a non-atomic 
> string; doing so requires a lookup in a per-thread atomic string hash table.
>
> 2) It’s very inexpensive to compare one atomic string with another. The cost 
> is just a pointer comparison. The actual string length and data don’t need to 
> be compared, because on any one thread no AtomicString can be equal to any 
> other AtomicString.
>
> 3) If a particular string already exists in the atomic string table, 
> allocating another string that is equal to it does not cost any additional 
> memory. The atomic string is shared and the cost is looking it up in the 
> per-thread atomic string hash table and incrementing its reference count.
>
> 4) There are special considerations if you want to use an atomic string on a 
> thread other than the one it was created on since each thread has its own 
> atomic string hash table.
>
> Generally speaking, we use AtomicString to make string comparisons fast and 
> to save memory when many equal strings are likely to be allocated. For 
> example, we use AtomicString for HTML attribute names so we can compare them 
> quickly, and for both HTML attribute names and values since it’s common to 
> have many identical ones and we save memory.
>
> It’s not a good idea to spend the extra cost to construct an AtomicString if 
> neither the comparison nor the memory savings applies.
>
> It’s unnecessarily costly to convert an atomic string to a non-atomic string 
> and then back to an atomic string, since it requires an additional hash table 
> lookup. Thus if you’re starting with an atomic string it’s best to keep the 
> value in variables of type AtomicString and AtomicStringImpl* if possible.

I don't mean to intrude, but I believe we store a bit on StringImpl
that makes conversion from String and StringImpl to AtomicString fast
if the underlying StringImpl is already in the AtomicStringTable:

https://trac.webkit.org/browser/trunk/Source/WTF/wtf/text/AtomicString.h#L185

ALWAYS_INLINE static PassRefPtr<StringImpl> add(StringImpl* r)
{
    if (!r || r->isAtomic())
        return r;
    return addSlowCase(r);
}

Adam
_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to