Pharo-users
By thread
pharo-users@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
December 2016
- 78 participants
- 402 messages
Re: [Pharo-users] real world pharo web application set ups
by jtuchel@objektfabrik.de
Victor,
Am 14.12.16 um 19:23 schrieb Vitor Medina Cruz:
>
> If I tell you that my current estimate is that a Smalltalk image
> with Seaside will not be able to handle more than 20 concurrent
> users, in many cases even less.
>
>
> Seriously? That is kinda a low number, I would expect more for each
> image. Certainly it depends much on many things, but it is certainly
> very low for a rough estimate, why you say that?
seriously, I think 20 is very optimistic for several reasons.
One, you want to be fast and responsive for every single user, so there
is absolutely no point in going too close to any limit. It's easy to
lose users by providing bad experience.
Second, in a CRUD Application, you mostly work a lot with DB queries.
And you connect to all kinds of stuff and do I/O. Some of these things
simply block the VM. Even if that is only for 0.3 seconds, you postpone
processing for each "unaffected" user by these 0.3 seconds, so this adds
to significant delays in response time. And if you do some heavy db
operations, 0.3 seconds is not a terribly bad estimate. Add to that the
materialization and stuff within the Smalltalk image.
Seaside adapters usually start off green threads for each request. But
there are things that need to be serialized (like in a critical Block).
So in reality, users block each other way more often than you'd like.
So if you asked me to give a more realistic estimation, I'd correct
myself down to a number between 5 and probably a maximum of 10 users.
Everything else means you must use all those fancy tricks and tools
people mention in this thread.
So what you absolutely need to do is start with an estimate of 5
concurrent users per image and look for ways to distribute work among
servers/images so that these blocking situations are down to a minimum.
If you find your software works much better, congratulate yourself and
stack up new machines more slowly than initially estimated.
Before you turn around and say: Smalltalk is unsuitable for the web,
let's take a brief look at what concurrent users really means.
Concurrent users are users that request some processing from the server
at they very same time (maybe within an interval of 200-400msec). This
is not the same as 5 people being currently logged on to the server and
requesting something sometimes. 5 concurrent users can be 20, 50, 100
users who are logged in at the same time.
Then there is this sad "share all vs. share nothing" argument. In
Seaside you keep all your objects alive (read from db and materialized)
between web requests. IN share nothing, you read everything back from
disc/db whenever a request comes in. This also takes time and ressources
(and pssibly blocks the server for the blink of an eye or two). You
exchange RAM with CPU cycles and I/O. It is extremely hard to predict
what works better, and I guess nobody ever made A/B tests. It's all just
theoretical bla bla and guesses of what definitely must be better in
one's world.
Why do I come up with this share everything stuff? Because it usually
means that each user that is logged on holds onto a load of objects on
the server side (session storage), like their user account, shopping
card, settings, last purchases, account information and whatnot. That's
easily a list of a few thousand objects (and be it only Proxies) that
take up space and want to be inspected by the garbage collector. So each
connected user not only needs CPU cycles whenever they send a request to
the server, but also uses RAM. In our case, this can easily be 5-10 MB
of objects per user. Add to that the shadow copies that your persistence
mechanism needs for undo and stuff, and all the data Seaside needs for
Continuations etc, and each logged on users needs 15, 20 or more MB of
object space. Connect ten users and you have 150-200 MB. That is not a
problem per se, but also means there is some hard limit, especially in a
32 bit world. You don't want your server to slow down because it cannot
allocate new memory or can't find contiguous slots for stuff and GCs all
the time.
To sum up, I think the number of influencing factors is way too high to
really give a good estimate. Our experience (based on our mix of
computation and I/O) says that 5 concurrent users per image is doable
without negative impact on other users. Some operations take so much
time that you really need to move them out of the front-facing image and
distribute work to backend servers. More than 5 is probably possible but
chances are that there are operations that will affect all users and
with every additional user there is a growing chance that you have 2 or
more requesting the yery same operation within a very short interval.
This will make things worse and worse.
So I trust in you guys having lots of cool tools around and knowing
loads of tricks to wrench out much more power of a single Smalltalk
image, but you also need to take a look at your productivity and speed
in creating new features and fixing bugs. Sometimes throwing hardware at
a problem like growth and starting with a clever architecture to scale
on multiple layers is just the perfect thing to do. To me, handling 7
instead of 5 concurrent users is not such a big win as long as we are
not in a posotion where we have so many users that this really matters.
For sites like Amazon, Google, Facebook etc. saving 40% in server cost
by optimizing the software (investing a few man years) is significant. I
hope we'll soon change our mind about this question ;-)
So load balancing and services outsourced to backend servers are key to
scalability. This, btw, is not smalltalk specific (some people seem to
think you won't get these problems in Java or Ruby because they are made
for the web...).
Joachim
Dec. 15, 2016
Re: [Pharo-users] version 118
by Robert Withers
119 is out, I renamed the zip so I can update versions without notifying
everyone. So this link is always current.
https://www.dropbox.com/s/z1ajc9k825a47cx/Whisper.zip?dl=0
On 12/15/2016 2:57 AM, Robert Withers wrote:
> sorry, I forgot again. here is a link:
> https://www.dropbox.com/s/z1ajc9k825a47cx/Whisper.118.zip?dl=0
>
>
> On 12/15/2016 2:54 AM, Robert Withers wrote:
>> Here is an update. gracias
>>
>
Dec. 15, 2016
Re: [Pharo-users] version 118
by Robert Withers
sorry, I forgot again. here is a link:
https://www.dropbox.com/s/z1ajc9k825a47cx/Whisper.118.zip?dl=0
On 12/15/2016 2:54 AM, Robert Withers wrote:
> Here is an update. gracias
>
Dec. 15, 2016
Re: [Pharo-users] What can we look forward to in 2017?
by Offray Vladimir Luna Cárdenas
On 14/12/16 11:38, Dimitris Chloupis wrote:
>
> On Wed, Dec 14, 2016 at 5:35 PM Offray Vladimir Luna Cárdenas
> <offray.luna(a)mutabit.com <mailto:offray.luna@mutabit.com>> wrote:
>
> This is a good example of the "empowering map" I talk about about
> "Pharo/Smalltalk places for you". What we can look forward in 2017
> is different for different people, so going beyond the "most
> exiting developments", hype and shiny new things is also a way to
> show how Pharo/Smalltalk are different. We can provide shine and
> hype, but also we're building stuff for different interests and
> people and that is even more worthy to look for the upcoming times
> (2017 and beyond).
>
> Cheers,
>
> Offray
>
>
> I think there is big difference between doing something exciting
> versus doing something useful. Excitement dies out but usefulness does
> not. I don't do it to make Pharo look cool, I do it because I need it.
> I also do not like to do something and then abandon it like it happens
> for 99% of the open source software.
>
Yes. That's why I'm inviting Richard to go beyond exiting to
interesting. He has accepted my invitation.
Cheers,
Offray
Dec. 15, 2016
Re: [Pharo-users] wwwhisper
by Robert Withers
I have no idea if that's true, I like to dream and I am just glad it is
here. happy holidays.
On 12/14/2016 6:46 PM, Robert Withers wrote:
> here's a good step I think it settled well. encoders are next. I
> haven't got any java left . Merry Christmas! Here's the profile. AS
> fast as bitblt are you serious?
>
> ____
>
> - 27380 tallies, 28129 msec.
>
> **Tree**
> --------------------------------
> Process: (40s) 95416: nil
> --------------------------------
> 13.6% {3815ms} MessageTally class>>spyOn:reportOtherProcesses:
> 13.6% {3815ms} MessageTally>>spyEvery:on:
> 13.6% {3815ms} BlockClosure>>ensure:
> 13.6% {3815ms} [] TestRunner>>runProfiled
> 13.6% {3815ms} TestRunner>>runAll
> 13.6% {3814ms} TestRunner>>runSuite:
> 13.6% {3814ms} TestRunner>>basicRunSuite:do:
> 13.6% {3814ms} BlockClosure>>ensure:
> 13.6% {3814ms} [] TestRunner>>basicRunSuite:do:
> 13.6% {3814ms}
> OrderedCollection(Collection)>>do:displayingProgress:every:
> 13.6% {3814ms}
> ByteString(String)>>displayProgressFrom:to:during:
> 13.6% {3814ms}
> ByteString(String)>>displayProgressAt:from:to:during:
> 13.6% {3814ms} ProgressInitiationException
> class>>display:at:from:to:during:
> 13.6% {3814ms}
> ProgressInitiationException>>display:at:from:to:during:
> 13.6% {3814ms}
> ProgressInitiationException(Exception)>>signal
> 13.6% {3814ms}
> MethodContext(ContextPart)>>handleSignal:
> 13.6% {3814ms}
> UndefinedObject>>handleSignal:
> 13.6% {3814ms}
> ProgressInitiationException>>defaultAction
> 13.6% {3814ms}
> ProgressInitiationException(Exception)>>resume
> 13.6% {3814ms}
> ProgressInitiationException>>defaultResumeValue
> 13.6% {3814ms}
> MorphicUIManager>>displayProgress:at:from:to:during:
> 13.6% {3813ms}
> BlockClosure>>ensure:
> 13.6% {3813ms} []
> MorphicUIManager>>displayProgress:at:from:to:during:
> 13.6% {3811ms}
> BlockClosure>>on:do:
> 13.6% {3811ms} [[]]
> MorphicUIManager>>displayProgress:at:from:to:during:
> 13.6% {3811ms} []
> OrderedCollection(Collection)>>do:displayingProgress:every:
> 13.6% {3811ms}
> OrderedCollection>>do:
> 13.6% {3811ms}
> [[]] OrderedCollection(Collection)>>do:displayingProgress:every:
> 13.2% {3719ms}
> [] TestRunner>>runSuite:
> 13.2%
> {3719ms} TestRunner>>runTest:
> 13.2%
> {3718ms} MoreDataTestCase(TestCase)>>run:
> 13.2% {3718ms} TestResult>>runCase:
> 13.2% {3718ms} BlockClosure>>on:do:
> 13.2% {3718ms} [] TestResult>>runCase:
> 13.2% {3718ms} BlockClosure>>on:do:
> 13.2% {3718ms} [[]] TestResult>>runCase:
> 13.2% {3718ms} MoreDataTestCase(TestCase)>>runCase
> 13.2% {3718ms} BlockClosure>>ensure:
> 13.2% {3718ms} [] MoreDataTestCase(TestCase)>>runCase
> 12.7% {3583ms} MoreDataTestCase(TestCase)>>timeout:after:
> 12.7% {3582ms} BlockClosure>>ensure:
> 12.7% {3582ms} [] MoreDataTestCase(TestCase)>>timeout:after:
> 12.7% {3582ms} BlockClosure>>on:do:
> 12.7% {3582ms} [[]] MoreDataTestCase(TestCase)>>runCase
> 12.7% {3580ms} MoreDataTestCase(TestCase)>>performTest
> 1.3% {366ms} MoreDataTestCase>>testDoubleDataDBL_AESede
> 1.3% {366ms} ConnectTestCase>>testConnect
> 1.3% {365ms} MoreDataTestCase>>testDoubleData
> 1.3% {364ms} DataTestCase>>testData
> 1.3% {358ms} SqueakJavaTestCase>>testData
> 1.3% {356ms} MoreDataTestCase>>testDoubleDataNoisy
> 1.3% {354ms} MoreDataTestCase>>testDoubleDataAES
> 1.3% {354ms} MoreDataTestCase>>testDoubleDataDES
> 1.2% {350ms} MoreDataTestCase>>testEmptyData
> 1.2% {347ms} MoreDataTestCase>>testDoubleDataDESOverAESede
> --------------------------------
> Process: other processes
> --------------------------------
> 67.0% {18857ms} [] ProcessorScheduler class>>startUp
> |67.0% {18857ms} ProcessorScheduler class>>idleProcess
> 18.6% {5241ms} [] TransportEndpoint(ProtocolEndpoint)>>run
> 18.6% {5241ms} TransportEndpoint(ProtocolEndpoint)>>serverLoop
> 18.5% {5206ms} BlockClosure>>on:do:
> 18.5% {5206ms} [] TransportEndpoint(ProtocolEndpoint)>>serverLoop
> 18.2% {5120ms} FrameChunker>>upcallFrame:
> 18.2% {5119ms} FrameChunker>>drainBuffer
> 17.8% {5002ms} BlockClosure>>on:do:
> 17.8% {5002ms} [] FrameChunker>>drainBuffer
> 17.8% {5002ms} OperationProtocol>>upcallFrame:
> 10.2% {2867ms}
> OperationProtocol(StatefulProtocol)>>transitionEvent:with:
> |10.2% {2867ms}
> ProtocolStateTransition>>transitionFor:with:
> | 3.8% {1080ms} OperationProtocol>>processGo:
> | |1.4% {383ms}
> OperationProtocol>>processDhParm:incoming:
> | | |1.4% {383ms}
> EncryptionSecrets>>processDhParm:incoming:
> | | | 1.3% {371ms}
> DiffieHellman>>receiveMessage:
> | | | 1.3% {371ms}
> LargePositiveInteger(Integer)>>raisedTo:modulo:
> | | | 1.3% {371ms}
> LargePositiveInteger(Integer)>>slidingLeftRightRaisedTo:modulo:
> | | | 1.3% {368ms}
> LargePositiveInteger>>\\
> | |1.1% {323ms} OperationProtocol>>dhParm
> | | 1.1% {323ms} EncryptionSecrets>>dhParm
> | | 1.1% {323ms} DiffieHellman>>sendMessage
> | | 1.1% {323ms}
> SmallInteger(Integer)>>raisedTo:modulo:
> | | 1.1% {323ms}
> SmallInteger(Integer)>>slidingLeftRightRaisedTo:modulo:
> | | 1.1% {316ms} LargePositiveInteger>>\\
> | 3.5% {987ms} OperationProtocol>>processGoToo:
> | |3.5% {976ms}
> OperationProtocol>>processDhParm:incoming:
> | | 3.5% {976ms}
> EncryptionSecrets>>processDhParm:incoming:
> | | 3.3% {942ms} DiffieHellman>>receiveMessage:
> | | 3.3% {942ms}
> LargePositiveInteger(Integer)>>raisedTo:modulo:
> | | 3.3% {942ms}
> LargePositiveInteger(Integer)>>slidingLeftRightRaisedTo:modulo:
> | | 3.3% {934ms} LargePositiveInteger>>\\
> | | 2.4% {672ms}
> Array(SequenceableCollection)>>first
> | 2.4% {686ms} OperationProtocol>>processReplyInfo:
> | 1.5% {430ms} OperationProtocol>>dhParm
> | 1.5% {430ms} EncryptionSecrets>>dhParm
> | 1.5% {430ms} DiffieHellman>>sendMessage
> | 1.5% {430ms}
> SmallInteger(Integer)>>raisedTo:modulo:
> | 1.5% {430ms}
> SmallInteger(Integer)>>slidingLeftRightRaisedTo:modulo:
> | 1.5% {428ms} LargePositiveInteger>>\\
> | 1.1% {317ms}
> Array(SequenceableCollection)>>first
> 7.5% {2114ms} OperationProtocol(Object)>>etrace:msg:
> 7.5% {2114ms} OperationProtocol(Object)>>etrace:
> 7.5% {2114ms}
> OperationProtocol(Object)>>triggerEvent:with:
> 7.5% {2114ms}
> OperationProtocol(Object)>>triggerEvent:withArguments:
> 7.5% {2114ms}
> WeakMessageSend>>valueWithArguments:
> 7.5% {2114ms}
> WeakMessageSend>>valueWithArguments:otherwise:
> 7.5% {2114ms}
> WeakMessageSend>>withEnsuredReceiverAndArgumentsDo:otherwise:
> 7.5% {2114ms} []
> WeakMessageSend>>valueWithArguments:otherwise:
> 7.5% {2114ms}
> TraceMonitor>>handleEtrace:
> 7.1% {1999ms}
> TraceMonitor>>traceEventToStream:
> 7.1% {1999ms} Semaphore>>critical:
> 7.1% {1999ms}
> BlockClosure>>ensure:
> 7.1% {1999ms} []
> Semaphore>>critical:
> 7.1% {1999ms} []
> TraceMonitor>>traceEventToStream:
> 7.0% {1978ms}
> CompositeWriteStream>>flush
> 7.0% {1978ms}
> Dictionary>>do:
> 7.0% {1978ms}
> Dictionary>>valuesDo:
> 7.0% {1978ms}
> Dictionary>>associationsDo:
> 7.0% {1978ms} []
> Dictionary>>valuesDo:
> 7.0% {1978ms}
> [] CompositeWriteStream>>flush
> 7.0%
> {1978ms} TranscriptStream>>flush
> 7.0%
> {1978ms} TranscriptStream>>endEntry
> 7.0%
> {1978ms} Semaphore>>critical:
> 7.0% {1978ms} BlockClosure>>ensure:
> 7.0% {1978ms} [] Semaphore>>critical:
>
> 7.0% {1978ms} [] TranscriptStream>>endEntry
> 7.0% {1978ms} TranscriptStream(Object)>>changed:
> 7.0% {1978ms} DependentsArray>>do:
> 7.0% {1977ms} [] TranscriptStream(Object)>>changed:
> 7.0% {1977ms} PluggableTextMorphPlus>>update:
> 7.0% {1977ms} PluggableTextMorphPlus(PluggableTextMorph)>>update:
> 5.8% {1622ms} PluggableTextMorphPlus(Morph)>>refreshWorld
> |5.8% {1622ms} PasteUpMorph>>displayWorldSafely
> | 5.8% {1622ms} WorldState>>displayWorldSafely:
> | 5.8% {1622ms} BlockClosure>>ifError:
> | 5.8% {1622ms} BlockClosure>>on:do:
> | 5.8% {1622ms} [] WorldState>>displayWorldSafely:
> | 5.8% {1622ms} PasteUpMorph>>displayWorld
> | 5.8% {1622ms} PasteUpMorph>>privateOuterDisplayWorld
> | 5.8% {1622ms} WorldState>>displayWorld:submorphs:
> | 5.7% {1609ms}
> WorldState>>drawWorld:submorphs:invalidAreasOn:
> | 5.7% {1609ms} Array(SequenceableCollection)>>do:
> | 4.0% {1113ms} []
> WorldState>>drawWorld:submorphs:invalidAreasOn:
> | |4.0% {1113ms} Rectangle>>allAreasOutsideList:do:
> | | 4.0% {1113ms}
> Rectangle>>allAreasOutsideList:startingAt:do:
> | | 3.9% {1109ms} [[]]
> WorldState>>drawWorld:submorphs:invalidAreasOn:
> | | 3.9% {1109ms}
> FormCanvas(Canvas)>>fullDrawMorph:
> | | 3.9% {1109ms}
> FormCanvas(Canvas)>>fullDraw:
> | | 3.9% {1109ms}
> PluggableSystemWindow(Morph)>>fullDrawOn:
> | | 3.6% {1022ms}
> PluggableSystemWindow(Morph)>>drawSubmorphsOn:
> | | 3.5% {998ms} []
> PluggableSystemWindow(Morph)>>drawSubmorphsOn:
> | | 3.5% {998ms}
> Array(SequenceableCollection)>>reverseDo:
> | | 3.5% {998ms} [[]]
> PluggableSystemWindow(Morph)>>drawSubmorphsOn:
> | | 3.5% {998ms}
> FormCanvas(Canvas)>>fullDrawMorph:
> | | 3.5% {998ms}
> FormCanvas(Canvas)>>fullDraw:
> | | 3.5% {998ms}
> PluggableTextMorphPlus(Morph)>>fullDrawOn:
> | | 2.6% {722ms}
> PluggableTextMorphPlus(Morph)>>drawSubmorphsOn:
> | | 2.6% {722ms} []
> PluggableTextMorphPlus(Morph)>>drawSubmorphsOn:
> | | 2.6% {722ms}
> Array(SequenceableCollection)>>reverseDo:
> | | 2.6% {722ms}
> [[]] PluggableTextMorphPlus(Morph)>>drawSubmorphsOn:
> | | 2.6% {722ms}
> FormCanvas(Canvas)>>fullDrawMorph:
> | | 2.6%
> {722ms} FormCanvas(Canvas)>>fullDraw:
> | | 2.6%
> {722ms} TransformMorph(Morph)>>fullDrawOn:
> | | 2.4% {688ms} TransformMorph>>drawSubmorphsOn:
> | | 2.4% {688ms}
> FormCanvas>>transformBy:clippingTo:during:smoothing:
> | | 2.4% {688ms} []
> TransformMorph>>drawSubmorphsOn:
> | | 2.4% {688ms}
> Array(SequenceableCollection)>>reverseDo:
> | | 2.4% {688ms} [[]]
> TransformMorph>>drawSubmorphsOn:
> | | 2.4% {688ms}
> FormCanvas(Canvas)>>fullDrawMorph:
> | | 2.4% {688ms}
> FormCanvas(Canvas)>>fullDraw:
> | | 2.4% {688ms}
> TextMorphForEditView(Morph)>>fullDrawOn:
> | | 2.4%
> {687ms} FormCanvas(Canvas)>>drawMorph:
> | | 2.4%
> {687ms} FormCanvas(Canvas)>>draw:
> | | 2.4% {686ms} TextMorphForEditView(TextMorph)>>drawOn:
> | | 2.4% {685ms} FormCanvas>>paragraph:bounds:color:
> | | 2.4% {685ms} NewParagraph>>displayOn:using:at:
> | | 2.4% {685ms}
> BitBltDisplayScanner(DisplayScanner)>>displayLine:offset:leftInRun:
> | | 2.3% {661ms} BitBltDisplayScanner>>displayString:from:to:at:
> | | 2.3% {661ms} StrikeFont>>displayString:on:from:to:at:kern:
> | | 1.3% {364ms}
> GrafPort(BitBlt)>>displayString:from:to:at:strikeFont:kern:
> | | |1.3% {363ms}
> GrafPort(BitBlt)>>basicDisplayString:from:to:at:strikeFont:kern:
> | | 1.1% {297ms} Point>>=
> | 1.8% {496ms} primitives
> 1.3% {354ms} PluggableTextMorphPlus(PluggableTextMorph)>>handleEdit:
>
> **Leaves**
> 67.0% {18857ms} ProcessorScheduler class>>idleProcess
> 5.4% {1505ms} Array(SequenceableCollection)>>first
> 2.5% {704ms} Point>>=
> 2.3% {644ms} Array(SequenceableCollection)>>do:
> 2.0% {558ms} LargePositiveInteger>>\\
> 1.9% {540ms} ByteArray>>bitXor:
> 1.9% {536ms}
> GrafPort(BitBlt)>>basicDisplayString:from:to:at:strikeFont:kern:
> 1.6% {438ms} SHA1>>finalHash
> 1.4% {385ms} LargePositiveInteger(Integer)>>bitShift:
> 1.4% {383ms} SHA1>>hashStream:
> 1.3% {362ms} SimpleBorder>>width
>
> **Memory**
> old +0 bytes
> young +27,152 bytes
> used +27,152 bytes
> free -27,152 bytes
>
> **GCs**
> full 0 totalling 0 ms (0% uptime)
> incr 558 totalling 198 ms (0.7% uptime), avg 0.4 ms
> tenures 11,171 (avg 0 GCs/tenure)
> root table 0 overflows
>
Dec. 15, 2016
whisper next steps encoders focused
by Charlie Robbats
I appreciate any feedback. Thank you for Squeak! I am delighted, thanks
to the community. So many projects in our semantic clouds. Thank you. I
think it is as fast as bitblt? Thanks!
Merry Christmas welcome family.
https://www.dropbox.com/s/z1ajc9k825a47cx/Whisper-rww.115.zip?dl=0
Dec. 14, 2016
wwwhisper
by Robert Withers
here's a good step I think it settled well. encoders are next. I haven't
got any java left . Merry Christmas! Here's the profile. AS fast as
bitblt are you serious?
____
- 27380 tallies, 28129 msec.
**Tree**
--------------------------------
Process: (40s) 95416: nil
--------------------------------
13.6% {3815ms} MessageTally class>>spyOn:reportOtherProcesses:
13.6% {3815ms} MessageTally>>spyEvery:on:
13.6% {3815ms} BlockClosure>>ensure:
13.6% {3815ms} [] TestRunner>>runProfiled
13.6% {3815ms} TestRunner>>runAll
13.6% {3814ms} TestRunner>>runSuite:
13.6% {3814ms} TestRunner>>basicRunSuite:do:
13.6% {3814ms} BlockClosure>>ensure:
13.6% {3814ms} [] TestRunner>>basicRunSuite:do:
13.6% {3814ms}
OrderedCollection(Collection)>>do:displayingProgress:every:
13.6% {3814ms}
ByteString(String)>>displayProgressFrom:to:during:
13.6% {3814ms}
ByteString(String)>>displayProgressAt:from:to:during:
13.6% {3814ms} ProgressInitiationException
class>>display:at:from:to:during:
13.6% {3814ms}
ProgressInitiationException>>display:at:from:to:during:
13.6% {3814ms}
ProgressInitiationException(Exception)>>signal
13.6% {3814ms}
MethodContext(ContextPart)>>handleSignal:
13.6% {3814ms}
UndefinedObject>>handleSignal:
13.6% {3814ms}
ProgressInitiationException>>defaultAction
13.6% {3814ms}
ProgressInitiationException(Exception)>>resume
13.6% {3814ms}
ProgressInitiationException>>defaultResumeValue
13.6% {3814ms}
MorphicUIManager>>displayProgress:at:from:to:during:
13.6% {3813ms}
BlockClosure>>ensure:
13.6% {3813ms} []
MorphicUIManager>>displayProgress:at:from:to:during:
13.6% {3811ms}
BlockClosure>>on:do:
13.6% {3811ms} [[]]
MorphicUIManager>>displayProgress:at:from:to:during:
13.6% {3811ms} []
OrderedCollection(Collection)>>do:displayingProgress:every:
13.6% {3811ms}
OrderedCollection>>do:
13.6% {3811ms}
[[]] OrderedCollection(Collection)>>do:displayingProgress:every:
13.2% {3719ms}
[] TestRunner>>runSuite:
13.2%
{3719ms} TestRunner>>runTest:
13.2%
{3718ms} MoreDataTestCase(TestCase)>>run:
13.2% {3718ms} TestResult>>runCase:
13.2% {3718ms} BlockClosure>>on:do:
13.2% {3718ms} [] TestResult>>runCase:
13.2% {3718ms} BlockClosure>>on:do:
13.2% {3718ms} [[]] TestResult>>runCase:
13.2% {3718ms} MoreDataTestCase(TestCase)>>runCase
13.2% {3718ms} BlockClosure>>ensure:
13.2% {3718ms} [] MoreDataTestCase(TestCase)>>runCase
12.7% {3583ms} MoreDataTestCase(TestCase)>>timeout:after:
12.7% {3582ms} BlockClosure>>ensure:
12.7% {3582ms} [] MoreDataTestCase(TestCase)>>timeout:after:
12.7% {3582ms} BlockClosure>>on:do:
12.7% {3582ms} [[]] MoreDataTestCase(TestCase)>>runCase
12.7% {3580ms} MoreDataTestCase(TestCase)>>performTest
1.3% {366ms} MoreDataTestCase>>testDoubleDataDBL_AESede
1.3% {366ms} ConnectTestCase>>testConnect
1.3% {365ms} MoreDataTestCase>>testDoubleData
1.3% {364ms} DataTestCase>>testData
1.3% {358ms} SqueakJavaTestCase>>testData
1.3% {356ms} MoreDataTestCase>>testDoubleDataNoisy
1.3% {354ms} MoreDataTestCase>>testDoubleDataAES
1.3% {354ms} MoreDataTestCase>>testDoubleDataDES
1.2% {350ms} MoreDataTestCase>>testEmptyData
1.2% {347ms} MoreDataTestCase>>testDoubleDataDESOverAESede
--------------------------------
Process: other processes
--------------------------------
67.0% {18857ms} [] ProcessorScheduler class>>startUp
|67.0% {18857ms} ProcessorScheduler class>>idleProcess
18.6% {5241ms} [] TransportEndpoint(ProtocolEndpoint)>>run
18.6% {5241ms} TransportEndpoint(ProtocolEndpoint)>>serverLoop
18.5% {5206ms} BlockClosure>>on:do:
18.5% {5206ms} [] TransportEndpoint(ProtocolEndpoint)>>serverLoop
18.2% {5120ms} FrameChunker>>upcallFrame:
18.2% {5119ms} FrameChunker>>drainBuffer
17.8% {5002ms} BlockClosure>>on:do:
17.8% {5002ms} [] FrameChunker>>drainBuffer
17.8% {5002ms} OperationProtocol>>upcallFrame:
10.2% {2867ms}
OperationProtocol(StatefulProtocol)>>transitionEvent:with:
|10.2% {2867ms}
ProtocolStateTransition>>transitionFor:with:
| 3.8% {1080ms} OperationProtocol>>processGo:
| |1.4% {383ms}
OperationProtocol>>processDhParm:incoming:
| | |1.4% {383ms}
EncryptionSecrets>>processDhParm:incoming:
| | | 1.3% {371ms} DiffieHellman>>receiveMessage:
| | | 1.3% {371ms}
LargePositiveInteger(Integer)>>raisedTo:modulo:
| | | 1.3% {371ms}
LargePositiveInteger(Integer)>>slidingLeftRightRaisedTo:modulo:
| | | 1.3% {368ms} LargePositiveInteger>>\\
| |1.1% {323ms} OperationProtocol>>dhParm
| | 1.1% {323ms} EncryptionSecrets>>dhParm
| | 1.1% {323ms} DiffieHellman>>sendMessage
| | 1.1% {323ms}
SmallInteger(Integer)>>raisedTo:modulo:
| | 1.1% {323ms}
SmallInteger(Integer)>>slidingLeftRightRaisedTo:modulo:
| | 1.1% {316ms} LargePositiveInteger>>\\
| 3.5% {987ms} OperationProtocol>>processGoToo:
| |3.5% {976ms}
OperationProtocol>>processDhParm:incoming:
| | 3.5% {976ms}
EncryptionSecrets>>processDhParm:incoming:
| | 3.3% {942ms} DiffieHellman>>receiveMessage:
| | 3.3% {942ms}
LargePositiveInteger(Integer)>>raisedTo:modulo:
| | 3.3% {942ms}
LargePositiveInteger(Integer)>>slidingLeftRightRaisedTo:modulo:
| | 3.3% {934ms} LargePositiveInteger>>\\
| | 2.4% {672ms}
Array(SequenceableCollection)>>first
| 2.4% {686ms} OperationProtocol>>processReplyInfo:
| 1.5% {430ms} OperationProtocol>>dhParm
| 1.5% {430ms} EncryptionSecrets>>dhParm
| 1.5% {430ms} DiffieHellman>>sendMessage
| 1.5% {430ms}
SmallInteger(Integer)>>raisedTo:modulo:
| 1.5% {430ms}
SmallInteger(Integer)>>slidingLeftRightRaisedTo:modulo:
| 1.5% {428ms} LargePositiveInteger>>\\
| 1.1% {317ms}
Array(SequenceableCollection)>>first
7.5% {2114ms} OperationProtocol(Object)>>etrace:msg:
7.5% {2114ms} OperationProtocol(Object)>>etrace:
7.5% {2114ms}
OperationProtocol(Object)>>triggerEvent:with:
7.5% {2114ms}
OperationProtocol(Object)>>triggerEvent:withArguments:
7.5% {2114ms}
WeakMessageSend>>valueWithArguments:
7.5% {2114ms}
WeakMessageSend>>valueWithArguments:otherwise:
7.5% {2114ms}
WeakMessageSend>>withEnsuredReceiverAndArgumentsDo:otherwise:
7.5% {2114ms} []
WeakMessageSend>>valueWithArguments:otherwise:
7.5% {2114ms} TraceMonitor>>handleEtrace:
7.1% {1999ms}
TraceMonitor>>traceEventToStream:
7.1% {1999ms} Semaphore>>critical:
7.1% {1999ms} BlockClosure>>ensure:
7.1% {1999ms} []
Semaphore>>critical:
7.1% {1999ms} []
TraceMonitor>>traceEventToStream:
7.0% {1978ms}
CompositeWriteStream>>flush
7.0% {1978ms}
Dictionary>>do:
7.0% {1978ms}
Dictionary>>valuesDo:
7.0% {1978ms}
Dictionary>>associationsDo:
7.0% {1978ms} []
Dictionary>>valuesDo:
7.0% {1978ms}
[] CompositeWriteStream>>flush
7.0% {1978ms}
TranscriptStream>>flush
7.0%
{1978ms} TranscriptStream>>endEntry
7.0%
{1978ms} Semaphore>>critical:
7.0% {1978ms} BlockClosure>>ensure:
7.0% {1978ms} [] Semaphore>>critical:
7.0% {1978ms} [] TranscriptStream>>endEntry
7.0% {1978ms} TranscriptStream(Object)>>changed:
7.0% {1978ms} DependentsArray>>do:
7.0% {1977ms} [] TranscriptStream(Object)>>changed:
7.0% {1977ms} PluggableTextMorphPlus>>update:
7.0% {1977ms} PluggableTextMorphPlus(PluggableTextMorph)>>update:
5.8% {1622ms} PluggableTextMorphPlus(Morph)>>refreshWorld
|5.8% {1622ms} PasteUpMorph>>displayWorldSafely
| 5.8% {1622ms} WorldState>>displayWorldSafely:
| 5.8% {1622ms} BlockClosure>>ifError:
| 5.8% {1622ms} BlockClosure>>on:do:
| 5.8% {1622ms} [] WorldState>>displayWorldSafely:
| 5.8% {1622ms} PasteUpMorph>>displayWorld
| 5.8% {1622ms} PasteUpMorph>>privateOuterDisplayWorld
| 5.8% {1622ms} WorldState>>displayWorld:submorphs:
| 5.7% {1609ms}
WorldState>>drawWorld:submorphs:invalidAreasOn:
| 5.7% {1609ms} Array(SequenceableCollection)>>do:
| 4.0% {1113ms} []
WorldState>>drawWorld:submorphs:invalidAreasOn:
| |4.0% {1113ms} Rectangle>>allAreasOutsideList:do:
| | 4.0% {1113ms}
Rectangle>>allAreasOutsideList:startingAt:do:
| | 3.9% {1109ms} [[]]
WorldState>>drawWorld:submorphs:invalidAreasOn:
| | 3.9% {1109ms}
FormCanvas(Canvas)>>fullDrawMorph:
| | 3.9% {1109ms} FormCanvas(Canvas)>>fullDraw:
| | 3.9% {1109ms}
PluggableSystemWindow(Morph)>>fullDrawOn:
| | 3.6% {1022ms}
PluggableSystemWindow(Morph)>>drawSubmorphsOn:
| | 3.5% {998ms} []
PluggableSystemWindow(Morph)>>drawSubmorphsOn:
| | 3.5% {998ms}
Array(SequenceableCollection)>>reverseDo:
| | 3.5% {998ms} [[]]
PluggableSystemWindow(Morph)>>drawSubmorphsOn:
| | 3.5% {998ms}
FormCanvas(Canvas)>>fullDrawMorph:
| | 3.5% {998ms}
FormCanvas(Canvas)>>fullDraw:
| | 3.5% {998ms}
PluggableTextMorphPlus(Morph)>>fullDrawOn:
| | 2.6% {722ms}
PluggableTextMorphPlus(Morph)>>drawSubmorphsOn:
| | 2.6% {722ms} []
PluggableTextMorphPlus(Morph)>>drawSubmorphsOn:
| | 2.6% {722ms}
Array(SequenceableCollection)>>reverseDo:
| | 2.6% {722ms}
[[]] PluggableTextMorphPlus(Morph)>>drawSubmorphsOn:
| | 2.6% {722ms}
FormCanvas(Canvas)>>fullDrawMorph:
| | 2.6% {722ms}
FormCanvas(Canvas)>>fullDraw:
| | 2.6%
{722ms} TransformMorph(Morph)>>fullDrawOn:
| | 2.4% {688ms} TransformMorph>>drawSubmorphsOn:
| | 2.4% {688ms}
FormCanvas>>transformBy:clippingTo:during:smoothing:
| | 2.4% {688ms} []
TransformMorph>>drawSubmorphsOn:
| | 2.4% {688ms}
Array(SequenceableCollection)>>reverseDo:
| | 2.4% {688ms} [[]]
TransformMorph>>drawSubmorphsOn:
| | 2.4% {688ms}
FormCanvas(Canvas)>>fullDrawMorph:
| | 2.4% {688ms}
FormCanvas(Canvas)>>fullDraw:
| | 2.4% {688ms}
TextMorphForEditView(Morph)>>fullDrawOn:
| | 2.4% {687ms}
FormCanvas(Canvas)>>drawMorph:
| | 2.4%
{687ms} FormCanvas(Canvas)>>draw:
| | 2.4%
{686ms} TextMorphForEditView(TextMorph)>>drawOn:
| | 2.4% {685ms} FormCanvas>>paragraph:bounds:color:
| | 2.4% {685ms} NewParagraph>>displayOn:using:at:
| | 2.4% {685ms}
BitBltDisplayScanner(DisplayScanner)>>displayLine:offset:leftInRun:
| | 2.3% {661ms} BitBltDisplayScanner>>displayString:from:to:at:
| | 2.3% {661ms} StrikeFont>>displayString:on:from:to:at:kern:
| | 1.3% {364ms} GrafPort(BitBlt)>>displayString:from:to:at:strikeFont:kern:
| | |1.3% {363ms}
GrafPort(BitBlt)>>basicDisplayString:from:to:at:strikeFont:kern:
| | 1.1% {297ms} Point>>=
| 1.8% {496ms} primitives
1.3% {354ms} PluggableTextMorphPlus(PluggableTextMorph)>>handleEdit:
**Leaves**
67.0% {18857ms} ProcessorScheduler class>>idleProcess
5.4% {1505ms} Array(SequenceableCollection)>>first
2.5% {704ms} Point>>=
2.3% {644ms} Array(SequenceableCollection)>>do:
2.0% {558ms} LargePositiveInteger>>\\
1.9% {540ms} ByteArray>>bitXor:
1.9% {536ms}
GrafPort(BitBlt)>>basicDisplayString:from:to:at:strikeFont:kern:
1.6% {438ms} SHA1>>finalHash
1.4% {385ms} LargePositiveInteger(Integer)>>bitShift:
1.4% {383ms} SHA1>>hashStream:
1.3% {362ms} SimpleBorder>>width
**Memory**
old +0 bytes
young +27,152 bytes
used +27,152 bytes
free -27,152 bytes
**GCs**
full 0 totalling 0 ms (0% uptime)
incr 558 totalling 198 ms (0.7% uptime), avg 0.4 ms
tenures 11,171 (avg 0 GCs/tenure)
root table 0 overflows
Dec. 14, 2016
Re: [Pharo-users] What can we look forward to in 2017?
by horrido
You've inspired me to consider a new subproject. It's tentatively called
"Smalltalk Showcase" (although I'll try to come up with a better name) and
it will present a series of stories about Pharo/Smalltalk developments that
demonstrate the incredible versatility and usefulness of Smalltalk. (It
doesn't have to be Pharo, but I'll be pleasantly surprised if there are cool
developments in Squeak, Cincom, Dolphin, GNU, etc.)
Here's an open call to Pharoers (and Smalltalkers) everywhere: Submit a
favourite project, including a URL to a website or repository that shows the
project in the best light, as well as an "abstract" that nicely summarizes
what the project is trying to accomplish. I'll select the ones that are most
interesting and do work-ups on them. If necessary, I'll query for more
details in an email reply. Send all submissions to: richard.eng(a)outlook.com
Most appreciated.
By the way, the first story will be on Grafoscopio.
--
View this message in context: http://forum.world.st/What-can-we-look-forward-to-in-2017-tp4926791p4926986…
Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
Dec. 14, 2016
Re: [Pharo-users] real world pharo web application set ups
by Sven Van Caekenberghe
> On 14 Dec 2016, at 23:29, Vitor Medina Cruz <vitormcruz(a)gmail.com> wrote:
>
> Pharo don't have non-blocking I/O?
It certainly does at the networking level, but some native code interfaces might not act so nice.
> On Wed, Dec 14, 2016 at 6:59 PM, Ramon Leon <ramon.leon(a)allresnet.com> wrote:
> On 12/14/2016 12:09 PM, Esteban A. Maringolo wrote:
> Can you extend on suspending the UI process? I never did that.
>
> I feed my images a start script on the command line
>
> pharo-vm-nox \
> -vm-sound-null -vm-display-null \
> /var/pharo/app.image \
> /var/pharo/startScript
>
> startScript containing one line (among others) like so...
>
> Project uiProcess suspend.
>
> I'm on an older Pharo, but I presume the newer ones are the same or similar. No sense in wasting CPU on a UI in a headless image
>
> Won't the idle use add up?
>
> Sure eventually, but you don't run more than a 2 or so per core so that'll never be a problem. You shouldn't be running 5 images on a single core, let alone more.
>
> In my case I served up to 20 concurrent users (out of ~100 total) with
> only 5 images. Plus another two images for the REST API. In a dual
> core server.
>
> That's barely a server, most laptops these days have more cores. Rent a virtual server with a dozen or more cores, then you can run a few images per core without the idle mattering at all and run 2 dozen images in total per 12 core server.
>
> Scale by adding cores and ram allowing you to run more images per box; or scale by running more boxes, ultimately, you need to spread out the load across many many cores.
>
> --
> Ramon Leon
>
>
>
Dec. 14, 2016