Thread overview | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
January 27, 2015 I left my program open for 9 hours and it used up 700mb of ram, could someone review it? | ||||
---|---|---|---|---|
| ||||
I feel like the only way I can get better right now is if someone with more knowledge can give me some advice on the code I have written. Here's the link: http://cl.ly/0s0Q1L1S3v0E How can I make it use less CPU/RAM? (Most code is in the Misc/SpaceBackground.d) |
January 27, 2015 Re: I left my program open for 9 hours and it used up 700mb of ram, could someone review it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Gan | Gan:
> How can I make it use less CPU/RAM?
Most tiny classes probably should be structs. More generally, use a struct every time you don't need a class.
You can start with those two:
struct SBRange {
double left = 0.0, right = 0.0, top = 0.0, bottom = 0.0;
}
struct Point(T) {
T x, y;
}
This probably isn't enough to solve your problems, but it's a start.
Bye,
bearophile
|
January 27, 2015 Re: I left my program open for 9 hours and it used up 700mb of ram, could someone review it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On Tuesday, 27 January 2015 at 15:45:47 UTC, bearophile wrote:
> Gan:
>
>> How can I make it use less CPU/RAM?
>
> Most tiny classes probably should be structs. More generally, use a struct every time you don't need a class.
>
> You can start with those two:
>
> struct SBRange {
> double left = 0.0, right = 0.0, top = 0.0, bottom = 0.0;
> }
>
> struct Point(T) {
> T x, y;
> }
>
> This probably isn't enough to solve your problems, but it's a start.
>
> Bye,
> bearophile
Is there some special stuff I gotta do extra with structs? Do they need manually allocated and released?
On a second question, do I ever need to manually release objects I create with new?
|
January 27, 2015 Re: I left my program open for 9 hours and it used up 700mb of ram, could someone review it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Gan | Gan: > Is there some special stuff I gotta do extra with structs? Do they need manually allocated and released? Most of your usages of tiny structs should be by value. So just keep in mind they are values. Even when you iterate with a foreach on a mutable array of them :-) > On a second question, do I ever need to manually release objects I create with new? Usually not. How much advanced do you want to be? :-) Bye, bearophile |
January 27, 2015 Re: I left my program open for 9 hours and it used up 700mb of ram, could someone review it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On Tuesday, 27 January 2015 at 19:26:12 UTC, bearophile wrote:
> Gan:
>
>> Is there some special stuff I gotta do extra with structs? Do they need manually allocated and released?
>
> Most of your usages of tiny structs should be by value. So just keep in mind they are values. Even when you iterate with a foreach on a mutable array of them :-)
>
>
>> On a second question, do I ever need to manually release objects I create with new?
>
> Usually not. How much advanced do you want to be? :-)
>
> Bye,
> bearophile
Thanks. I'll give structs a try.
When I start the program, it runs fine at 35mb of ram. It only keeps 15 objects stored in the arrays at a time so why do you think my ram usage increases to 700+ after many hours?
|
January 27, 2015 Re: I left my program open for 9 hours and it used up 700mb of ram, could someone review it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Gan | On Tuesday, 27 January 2015 at 19:59:08 UTC, Gan wrote:
> On Tuesday, 27 January 2015 at 19:26:12 UTC, bearophile wrote:
>> Gan:
>>
>>> Is there some special stuff I gotta do extra with structs? Do they need manually allocated and released?
>>
>> Most of your usages of tiny structs should be by value. So just keep in mind they are values. Even when you iterate with a foreach on a mutable array of them :-)
>>
>>
>>> On a second question, do I ever need to manually release objects I create with new?
>>
>> Usually not. How much advanced do you want to be? :-)
>>
>> Bye,
>> bearophile
>
> Thanks. I'll give structs a try.
>
> When I start the program, it runs fine at 35mb of ram. It only keeps 15 objects stored in the arrays at a time so why do you think my ram usage increases to 700+ after many hours?
Curiously, my CPU usage went from 10% to 5% after I changed to structs on Point and Range. Though my memory still climbs high.
|
January 27, 2015 Re: I left my program open for 9 hours and it used up 700mb of ram, could someone review it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Gan | On 28/01/2015 9:59 a.m., Gan wrote:
> On Tuesday, 27 January 2015 at 19:59:08 UTC, Gan wrote:
>> On Tuesday, 27 January 2015 at 19:26:12 UTC, bearophile wrote:
>>> Gan:
>>>
>>>> Is there some special stuff I gotta do extra with structs? Do they
>>>> need manually allocated and released?
>>>
>>> Most of your usages of tiny structs should be by value. So just keep
>>> in mind they are values. Even when you iterate with a foreach on a
>>> mutable array of them :-)
>>>
>>>
>>>> On a second question, do I ever need to manually release objects I
>>>> create with new?
>>>
>>> Usually not. How much advanced do you want to be? :-)
>>>
>>> Bye,
>>> bearophile
>>
>> Thanks. I'll give structs a try.
>>
>> When I start the program, it runs fine at 35mb of ram. It only keeps
>> 15 objects stored in the arrays at a time so why do you think my ram
>> usage increases to 700+ after many hours?
>
> Curiously, my CPU usage went from 10% to 5% after I changed to structs
> on Point and Range. Though my memory still climbs high.
Force a GC.collect() now and again. Disable it at the beginning too.
|
January 27, 2015 Re: I left my program open for 9 hours and it used up 700mb of ram, could someone review it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rikki Cattermole | On Tuesday, 27 January 2015 at 21:36:51 UTC, Rikki Cattermole wrote:
> On 28/01/2015 9:59 a.m., Gan wrote:
>> On Tuesday, 27 January 2015 at 19:59:08 UTC, Gan wrote:
>>> On Tuesday, 27 January 2015 at 19:26:12 UTC, bearophile wrote:
>>>> Gan:
>>>>
>>>>> Is there some special stuff I gotta do extra with structs? Do they
>>>>> need manually allocated and released?
>>>>
>>>> Most of your usages of tiny structs should be by value. So just keep
>>>> in mind they are values. Even when you iterate with a foreach on a
>>>> mutable array of them :-)
>>>>
>>>>
>>>>> On a second question, do I ever need to manually release objects I
>>>>> create with new?
>>>>
>>>> Usually not. How much advanced do you want to be? :-)
>>>>
>>>> Bye,
>>>> bearophile
>>>
>>> Thanks. I'll give structs a try.
>>>
>>> When I start the program, it runs fine at 35mb of ram. It only keeps
>>> 15 objects stored in the arrays at a time so why do you think my ram
>>> usage increases to 700+ after many hours?
>>
>> Curiously, my CPU usage went from 10% to 5% after I changed to structs
>> on Point and Range. Though my memory still climbs high.
>
> Force a GC.collect() now and again. Disable it at the beginning too.
I did a test and ran GC.collect() every loop but my memory usage continues to rise. I can see how you'd be able to lower CPU usage by running GC.collect() every now and then but right now I'm stuck on the memory issue.
Perhaps my problem lies in the C++ library SFML?
|
January 27, 2015 Re: I left my program open for 9 hours and it used up 700mb of ram, could someone review it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Gan | On 28/01/2015 11:30 a.m., Gan wrote:
> On Tuesday, 27 January 2015 at 21:36:51 UTC, Rikki Cattermole wrote:
>> On 28/01/2015 9:59 a.m., Gan wrote:
>>> On Tuesday, 27 January 2015 at 19:59:08 UTC, Gan wrote:
>>>> On Tuesday, 27 January 2015 at 19:26:12 UTC, bearophile wrote:
>>>>> Gan:
>>>>>
>>>>>> Is there some special stuff I gotta do extra with structs? Do they
>>>>>> need manually allocated and released?
>>>>>
>>>>> Most of your usages of tiny structs should be by value. So just keep
>>>>> in mind they are values. Even when you iterate with a foreach on a
>>>>> mutable array of them :-)
>>>>>
>>>>>
>>>>>> On a second question, do I ever need to manually release objects I
>>>>>> create with new?
>>>>>
>>>>> Usually not. How much advanced do you want to be? :-)
>>>>>
>>>>> Bye,
>>>>> bearophile
>>>>
>>>> Thanks. I'll give structs a try.
>>>>
>>>> When I start the program, it runs fine at 35mb of ram. It only keeps
>>>> 15 objects stored in the arrays at a time so why do you think my ram
>>>> usage increases to 700+ after many hours?
>>>
>>> Curiously, my CPU usage went from 10% to 5% after I changed to structs
>>> on Point and Range. Though my memory still climbs high.
>>
>> Force a GC.collect() now and again. Disable it at the beginning too.
>
> I did a test and ran GC.collect() every loop but my memory usage
> continues to rise. I can see how you'd be able to lower CPU usage by
> running GC.collect() every now and then but right now I'm stuck on the
> memory issue.
>
> Perhaps my problem lies in the C++ library SFML?
I had a quick look at your code.
I think its safe to assume the SFML isn't the problem.
Whats happening is on every iteration of the event loop, you are allocating, holding a reference somewhere and continuing on.
The GC even if it does run cannot release that memory as it is still held.
At this point maybe strip out what happens on each loop iteration to find out what is holding references. Divide and conquer.
|
January 27, 2015 Re: I left my program open for 9 hours and it used up 700mb of ram, could someone review it? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Gan | On Tuesday, 27 January 2015 at 22:30:13 UTC, Gan wrote:
> On Tuesday, 27 January 2015 at 21:36:51 UTC, Rikki Cattermole wrote:
>> On 28/01/2015 9:59 a.m., Gan wrote:
>>> On Tuesday, 27 January 2015 at 19:59:08 UTC, Gan wrote:
>>>> On Tuesday, 27 January 2015 at 19:26:12 UTC, bearophile wrote:
>>>>> Gan:
>>>>>
>>>>>> Is there some special stuff I gotta do extra with structs? Do they
>>>>>> need manually allocated and released?
>>>>>
>>>>> Most of your usages of tiny structs should be by value. So just keep
>>>>> in mind they are values. Even when you iterate with a foreach on a
>>>>> mutable array of them :-)
>>>>>
>>>>>
>>>>>> On a second question, do I ever need to manually release objects I
>>>>>> create with new?
>>>>>
>>>>> Usually not. How much advanced do you want to be? :-)
>>>>>
>>>>> Bye,
>>>>> bearophile
>>>>
>>>> Thanks. I'll give structs a try.
>>>>
>>>> When I start the program, it runs fine at 35mb of ram. It only keeps
>>>> 15 objects stored in the arrays at a time so why do you think my ram
>>>> usage increases to 700+ after many hours?
>>>
>>> Curiously, my CPU usage went from 10% to 5% after I changed to structs
>>> on Point and Range. Though my memory still climbs high.
>>
>> Force a GC.collect() now and again. Disable it at the beginning too.
>
> I did a test and ran GC.collect() every loop but my memory usage continues to rise. I can see how you'd be able to lower CPU usage by running GC.collect() every now and then but right now I'm stuck on the memory issue.
>
> Perhaps my problem lies in the C++ library SFML?
I commented out some stuff and it appears my massive memory consumption comes from my tile.redraw function:
void redraw() {
undrawn = false;
canvas.clear();
//Add stars
for (int i = 0; i < controller.starsPerTile; i++) {
Random gen;
gen.seed(unpredictableSeed);
int x = uniform(0, controller.tileSize, gen);
int y = uniform(0, controller.tileSize, gen);
double s = uniform(0, 10000, gen) / 10000.0;
double size = (s * (controller.starSizeMax - controller.starSizeMin)) + controller.starSizeMin;
if (x - size / 2 < 0) {
x += size / 2;
}
if (y - size / 2 < 0) {
y += size / 2;
}
if (x + size / 2 > controller.tileSize) {
x -= size / 2;
}
if (y + size / 2 > controller.tileSize) {
y -= size / 2;
}
drawStar(canvas, x, y, size, size);
}
canvas.display();
}
void drawStar(RenderTarget target, int centerX, int centerY, double width, double height) {
CircleShape star;
if (controller.multiColor == false) {
star = controller.stars[0];
} else {
Random gen;
gen.seed(unpredictableSeed);
star = controller.stars[uniform(0, controller.stars.length - 1, gen)];
}
star.position = Vector2f(centerX, centerY);
star.origin = Vector2f(0.5, 0.5);
star.scale = Vector2f(width / 100.0, height / 100.0);
target.draw(star);
}
Would you know why this is using hundreds of mb of rams?
|
Copyright © 1999-2021 by the D Language Foundation