Great!
I takes about 4 seconds in XO machine. Here is the result of MessageTally spyOn: [GetTextTranslator localeChanged: 'ja']
Cheers, - Takashi
---
- 4430 tallies, 4847 msec.
**Tree** 100.0% {4847ms} GetTextTranslator class>>localeChanged: 100.0% {4847ms} TextDomain>>localeChanged: 100.0% {4847ms} TextDomain>>loadMOForLocale: 99.9% {4842ms} MOFile>>load: 94.0% {4556ms} MOFile>>loadStringTable: |81.9% {3970ms} ByteString(String)>>convertFromWithConverter: | |60.0% {2908ms} UTF8TextConverter>>nextFromStream: | | |39.0% {1890ms} Unicode class>>value: | | | |27.7% {1343ms} Locale>>languageEnvironment | | | | |25.7% {1246ms} LanguageEnvironment class>>localeID: | | | | | 22.9% {1110ms} Dictionary>>at:ifAbsent: | | | | | 21.0% {1018ms} Dictionary(Set)>>findElementOrNil: | | | | | 19.9% {965ms} Dictionary>>scanFor: | | | | | 9.8% {475ms} LocaleID>>= | | | | | |6.9% {334ms} ByteString(String)>>= | | | | | | 4.9% {238ms} ByteString(String)>>compare:caseSensitive: | | | | | | 2.8% {136ms} primitives | | | | | | 2.1% {102ms} ByteString(String)>>compare:with:collated: | | | | | 8.3% {402ms} LocaleID>>hash | | | | | 4.4% {213ms} ByteString(String)>>hash | | | | | |2.3% {111ms} primitives | | | | | 2.0% {97ms} primitives | | | |5.0% {242ms} Character class>>leadingChar:code: | | | | |3.9% {189ms} Character class>>value: | | | | | 2.1% {102ms} Character>>setValue: | | | |3.3% {160ms} JapaneseEnvironment(LanguageEnvironment)>>leadingChar | | |7.9% {383ms} ReadStream(Stream)>>basicNext | | | |7.5% {364ms} primitives | | |4.9% {238ms} ReadStream(PositionableStream)>>isBinary | | |4.7% {228ms} primitives | | |3.5% {170ms} Character>>= | |10.7% {519ms} WriteStream>>nextPut: | | |4.3% {208ms} primitives | | |3.1% {150ms} Character>>isOctetCharacter | |5.5% {267ms} primitives | |2.2% {107ms} WriteStream>>contents |5.5% {267ms} MOFile>>readInt32 | 4.8% {233ms} MultiByteFileStream(PositionableStream)>>nextLittleEndianNumber: | 2.7% {131ms} primitives | 2.1% {102ms} MultiByteFileStream>>next: 3.8% {184ms} Dictionary>>at:put: **Leaves** 7.5% {364ms} ReadStream(Stream)>>basicNext 5.5% {267ms} ByteString(String)>>convertFromWithConverter: 4.9% {238ms} ReadStream(PositionableStream)>>isBinary 4.7% {228ms} UTF8TextConverter>>nextFromStream: 4.3% {208ms} WriteStream>>nextPut: 4.2% {204ms} UndefinedObject(Object)>>hash 3.5% {170ms} Character>>= 3.1% {150ms} Character>>isOctetCharacter 3.1% {150ms} ByteString(String)>>compare:caseSensitive: 3.0% {145ms} MultiByteFileStream(PositionableStream)>>nextLittleEndianNumber: 3.0% {145ms} Dictionary>>scanFor: 2.4% {116ms} ByteString(String)>>hash 2.4% {116ms} ByteString(String)>>compare:with:collated: 2.3% {111ms} Character>>setValue: 2.2% {107ms} ByteString(String)>>= 2.1% {102ms} SmallInteger(Magnitude)>>max: 2.0% {97ms} LocaleID>>hash
**Memory** old +576,968 bytes young +133,848 bytes used +710,816 bytes free -710,816 bytes
**GCs** full 0 totalling 0ms (0.0% uptime) incr 81 totalling 189ms (4.0% uptime), avg 2.0ms tenures 6 (avg 13 GCs/tenure) root table 0 overflows
korakurider@yahoo.co.jp wrote:
Hello. (I am sending off list as this is too half-baking :-)
First experimental prototype for a simple replacement of NaturalLanguageTranslator is attached.
How to run: (assuming language is 'ja')
1) prepare etoys.mo (japaense mo is attached also) 2) place etoys.mo at place at %imagePath%/locales/ja/LC_MESSAGES 3) starts etoys.image and apply the changeset 4) switch current locale to 'japanese' 5) doIt: "GetTextTranslator localeChanged: 'ja'", then mo is loaded 6) printIt: "GetTextTranslator translate: 'string' to: 'ja'" returns
translation.
My original plan was to replace method body of #tranlatedTo: as 6), but it doesn't work at this time. (see a in below)
As you know entire content of MO is loaded to memory in this MOFile implementation. I was worrying about that performance before this experiment. Actually I feel it would be usable at least on my PC box (Panasonic CF-W2). Could you please test it on real XO if you can?
Outstanding issues: (Please let me know how do you think)
a) to load utf-8 string from MO, correct leadingChar have to to be determined from locale. (That's why step 4) is needed proceeding to step 5) I know "LanguageEnvironment leadingChar" but I am totally
confused with relationship between LanguageEnvironment and Locale...
b) where and how to initialize the translator e.g. first call of "GetTextTranslator currentDomain:" and "
GetTextTranslator localeChanged:"
c) monitor actual locale change and handle it d) when and how to release resource to minimize meory foot print. e) what is default domain (currently 'etoys') f) preparation of MOs, ofcourse. g) fallback domain of translation, that Bert suggested
Cheers,
/Korakurider
Hi, Takashi. Thanks for testing!
I am really surprised how UTF8TextConverter is slow (and how my box run faster than XO :-P) Do you know the possibility of performance optimization of the conveter that Yoshiki mentioned in sqeueak-dev (http://lists.squeakfoundation.org/pipermail/squeak-dev/2007-June/117710.html )?
I imagine working set of strings needed on localeChange will be enough small. If this is true, initialization time will be able to reduced, by decoupling loading of bytestrings from conversion (of raw bytestring to squeak format), and convert on demand. But actually I am not sure about our target of performance optimization for FRS.
My intent is to stabilize integration of the new translator stuff and existing codebase (e.g. APIs independent to actual implementation, and how to use them). So I am going to continue working on squeak-only-implementation. You might want to replace the layer with libintrl based implementation. how do you think?
/Korakurider
--- Takashi Yamamiya tak@metatoys.org wrote:
Great!
I takes about 4 seconds in XO machine. Here is the result of MessageTally spyOn: [GetTextTranslator localeChanged: 'ja']
Cheers,
- Takashi
<snip>
-------------------------------------- Easy + Joy + Powerful = Yahoo! Bookmarks x Toolbar http://pr.mail.yahoo.co.jp/toolbar/
etoys-dev@lists.squeakfoundation.org