Sign in to follow this  
Dentoid

Optimization

Recommended Posts

Hey I hope I'm not asking for something that already is in the manual or so. I'm just wondering how much optimization AS does when compiling? Let's say I've got a const bool telling if the script is currently running on the server or not. If I then do a "if (isServer)", will that be evaluated at compiletime or evaluated each time the script executes? /Anders Stenberg

Share this post


Link to post
Share on other sites
You can search the source code for it... All I found was asCByteCode::Optimize, which strips away redunant code (i,e, SUSPEND, SUSPEND -> SUSPEND). It could be that the parser checks if the conditions for an "if" are constant and acts accordingly but I think not.


sToken t;
GetToken(&t);
if( t.type != ttIf )
{
Error(ExpectedToken("if"), &t);
return node;
}

node->UpdateSourcePos(t.pos, t.length);

GetToken(&t);
if( t.type != ttOpenParanthesis )
{
Error(ExpectedToken("("), &t);
return node;
}

node->AddChildLast(ParseAssignment());
if( isSyntaxError ) return node;

GetToken(&t);
if( t.type != ttCloseParanthesis )
{
Error(ExpectedToken(")"), &t);
return node;
}





It appears that the parser does not check the expression for "constantness" at this point.

Share this post


Link to post
Share on other sites
Kurioes:

It wouldn't be the parser that checked for constant expressions, but the compiler. But you're right that AngelScript doesn't optimize conditional statements with constant expressions. I might add this optimization in a future version.

It optimizes expressions with constant values, e.g 1+1 is substituted with 2.

It also does a post compile optimization to improve performance of some often occuring bytecode sequences.

Share this post


Link to post
Share on other sites
This would be a really good optimization. You could add a "define" keyword to the script engine that would behave like the #define c++ keyword or you could treat the const keyword like that. E.g.

const float CREATURE_SPEED = 5.5;
const float CREATURE_MOVE_STEP = 2.0;
float position = 0;

void Move(float delta)
{
position += delta * CREATURE_MOVE_STEP * CREATURE_SPEED;
}

A optimizing compiler would treat the above code like this:

position += delta * 11.0;


I've just recently stumbled upon AngelScript and I really like it. In fact, I like it so much that I'll try to help you, as much as I can, to make it the best scripting language ever :). I'm already working on a plugin for Visual Studio that will do syntax highlighting for AngelScript. When I have time, I'll take a peak at the source code. Compiler-time optimizations perform a very important role in execution speed.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
Quote:
Original post by grekster
Im pretty sure it would have to be evaluated at runtime otherwise it would always return the same value when you ran the script, whether the server was running or not.


Well the idea would be that "isServer" is a const, and only change inbetween runs, not runtime.


WitchLord:
It'd be nice with that kind of optimizations, but I guess other stuff is on higher prio. :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this