On Nov 13, 2007, at 10:12 AM, Sam Liddicott wrote:

* Michael Van Canneyt wrote, On 13/11/07 08:47:

On Tue, 13 Nov 2007, Sam Liddicott wrote:


Michael Van Canneyt wrote:

On Tue, 13 Nov 2007, Graeme Geldenhuys wrote:


  *  They tend to be slow compared no native types. In
      Delphi 6 they were very slow. How does it compare
      in FPC 2.2.0?


They are slower than native types, there is no way around this.
Almost each and every operation involving variants has some implicit calls
to variant support routines.


If the variant type is the correct type, no casts are done and the whole thing
is very quick.

Exactly: IF.

this means
a) Check if. This by itself involves a call to a helper routine.

It can be a simple compare. The delphi variant code that I disassembled was inline (hence "twice as big", doesn't involve a call but a simple compare).

The simple compare to determine the variant type is nothing compared to the overheads that will exist between the two systems communicating using the variants.

b) convert if not the same

With native types it's just a straight copy.

With variants it is usually a straight copy, and in cases where it usually isn't you were going to have to convert by hand anyway.
You should see that it is more than double the size.
If that doesn't convince someone that variants are SLOW, then I don't know
what will. Use -al for compiler options.


Twice as big doesn't mean slow at all.

Just have a look at the code before saying that :-)

I have disassembled the delphi variant code, ls -l doesn't give an indication of execution time.
Most of the extra code covers different branches based on the variant type, most of the extra code is NEVER used but there "in case" because, as you say,
pascal is a type safe language.

It must be checked, each time over and over again. Just look at the code.

The check is cheap. The conversion doesn't need to happen over and over again unless you want it to.

People who really want to can use the variant to aid a one-off conversion to a native statically typed variable, and this is STILL neater and simpler and less error prone than managing a manual type check and conversion and dealing with any error.

I would much rather have pascal manage the variant and conversions for me than
I have to manage it and get it wrong.

The point is that you don't need to do conversions when using typed variables.

This is not true; take most situations where variants are being used and you see they are being used to manage conversions. Type-ing of variables does not avoid the need for conversion. (Variants are typed in both senses, but I know what you mean).

Variants may or may not be a hack, but they are less of a hack than the alternative.

If people use variants when not integrating with duck-typing systems then they get the performance penalty they deserve.

In this conversation I'm thinking of using variants when integrating with COM systems, etc;

Perhaps you are thinking of lazy users who make everything a variant so they can have some kind of loosely typed compiled pascal-script. The fault would be with the user, not the variant.


I think it is the same debate between C++ programmers et PHP programmers. The first group like strong type checking because they want to know exacty how their data must be. The second one don't care of it and want lazy programming.

I do not agree with that, variant are not needed the most of the time, you always have a pascal routine to make your convertion if needed. If you always need a convertion, may be the type/modeling is not appropriated. Even if we have powerful computer nowdays, it is not necessary to add useless checks/code. We seek for performance because you don't want to be forced to have a 3GHz to open an explorer...

Another reason would be that I observe with a lazy programming language that programmers don't take care of their code and provide unmaintable code.

But it is only my thought




--
Damien Gerard
[EMAIL PROTECTED]



Reply via email to