Re: slow startup on windows
"John Selverian" <[email protected]> Sat, 26 Oct 2024 10:06:53 -0400
| Newsgroups | gmane.comp.lib.fox-toolkit.user |
|---|---|
| Organization | JAHM Software |
| Message-ID | <[email protected]> |
I put these loops into a different program I have that starts
essentially instantly on both Windows and Linux. On both
platforms these loops take about 7 seconds. Linux is running in a
VM on the Windows machine.
So I guess it not the allocation process.
Any other ideas I should try?
long num = 50000000;
// long num = 50,000,000;
{
FXString* strs = new FXString[num];
for (long i = 0; i < num; i++)
{
strs[i] = "test string";
}
delete[] strs;
}
{
FXString* tmp;
for (long i = 0; i < num; i++)
{
tmp = new FXString("test string");
delete tmp;
}
}
-----Original Message-----
From: [email protected] <[email protected]>
Sent: Friday, October 25, 2024 2:16 PM
To: [email protected]
Cc: [email protected]; 'Enno Rehling'
<[email protected]>; [email protected]
Subject: Re: [Foxgui-users] slow startup on windows
On 2024-10-25 10:43, John Selverian wrote:
> The program is a database where everything is stored as
strings,
> they're all wrapped in classes, so its actually stored as a 4D
array
> of classes. When it's running it takes 235 MB in memory.
>
> The strings are not displayed in the UI.
>
> I timed this:
>
> FXString* tmp;
> long num = 500000;
> //long num = 5000000;
> for (long i = 0; i < num; i++)
> {
> tmp = new FXString("test string");
> delete tmp;
> }
>
> For num = 500,000 it's somewhere around 1 second, for num =
> 5,000,000 takes about 3 seconds. I also used a longer string
("test
> string test string test string test string test string test
string
> test string test string ") and saw no effect. I'm just timing
in the
> debugger with a stopwatch, nothing fancy so the times are only
> approximate but clearly noticeable.
Of course, it depends on your machine, but it seems entirely
reasonable.
Debug vs. release may make significant difference. Also, make
sure target arch is set correctly [-with-arch=native optimizes
for local machine, i.e. the one the compiler is running on].
Your test is actually a-typical, you're actually doing 1,000,000
and 10,000,000 allocations. for each i, you're allocating both
the string and the string's buffer.
Also, repeatedly allocating and freeing the same size entity will
probably recycle memory, this is not the same as allocating NEW
memory 500,000 times.
A more fair test may be:
FXString strs = new FXString [num];
for (long i = 0; i < num; i++){
strs[i]="test string";
}
delete [] strs;
This will perform num+1 allocations, num for each string's
buffer, and one giant one for the array-of-strings.
FYI, time of a memory allocation is somewhat independent of the
size being allocated. Somewhat, because once the size exceeds a
certain value, the system will switch to an mmap call and do an
operating system call; for the gory details, look in the file
~/glibc/malloc/malloc.c.
-- JVZ