Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: Are Addresses From refaddr Unique Across Threads?

by aecooper (Acolyte)
on Feb 19, 2010 at 20:08 UTC ( #824248=note: print w/replies, xml ) Need Help??


in reply to Are Addresses From refaddr Unique Across Threads?

Hi all,

Well firstly many thanks for all your responses you have all been most helpful :-).

For brevity I shall refer to the traditional refaddr() on every access the refaddr approach and what I have proposed as the caching approach.

To reply to some of the comments made...

Why Not Use refaddr() Directly On An Empty Hash?

Well in the article that I referenced, someone posted performance results comparing various techniques. When compared against the classic basic blessed hash ref class, the traditional inside-out, refaddr approach ran 37% slower as against the caching variety only running 4% slower. Also using refaddr() every time you want to work out your hash key makes it very sensitive to cloning issues during multi-threading. This requires you to have a CLONE method and the %class_objects hash. Using the caching approach is not affected by the cloning issue and is much simpler and faster. As my class is called 1000s of times a second, performance is an issue.

The data cannot be exposed any more than it can with the traditional refaddr() approach as %class_records is private to the file containing the class (only thing in that file BTW). Anyway the caller could still get the key with the refaddr() approach, its just slightly less obvious.

One Can Compromise Che Object

The only thing that could be compromised is the key. The worst case is that a bit of memory is leaked when someone tinkers around with the internals of the public object. The actual %class_records hash is only accessible from within the class. The refaddr approach does not suffer from this memory leak problem because all they could do to affect the refaddr of the hash is to delete it which will call the destructor.

However accidental corruption is not very likely unlike in languages like C and C++. As for deliberate tinkering they would either quickly loose interest (as it doesn't gain them anything) or change the source code.

Use Of Hashes Containing Fields

Well this is a base class. As for any derived classes they are either going to be basic hash refs (ok could get a field clash but very unlikely as most people doing OO in perl tend to find out about what they are deriving from and are very unlikely to use a field named after the base class), something similar to this one (so will just add another field) or refaddr style ones (wouldn't care). When implementing a base class a blessed reference is the most derivation friendly when compared to code, array and scalar refs.

Basically perfection and complexity vs 98% solution that is a lot faster and simpler...

Why Not Just Use A Counter Or A Random Number?

Hehe yup point taken :-), probably would have done that at some point...

Why Not Upgrade To Perl 5.10?

A lot of distros are still on 5.8 (RedHat, Debian, CentOS, SlackWare?) and I have deliberately developed this software on an oldish distro so that users don't have to go through patching/upgrade hell just to get a library and GUI application working.

Many thanks once again. I will be using a counter/random number approach and check for clashes on object construction.

Yours sincerely,

Tony.

  • Comment on Re: Are Addresses From refaddr Unique Across Threads?

Replies are listed 'Best First'.
Re^2: Are Addresses From refaddr Unique Across Threads?
by tirwhan (Abbot) on Feb 20, 2010 at 10:48 UTC
    Minor point:
    A lot of distros are still on 5.8 (RedHat, Debian, CentOS, SlackWare?)

    I don't know about the others, but at least for Debian this is untrue. The current Debian stable (lenny, released almost exactly a year ago) runs Perl 5.10.0, and the previous stable release (etch) is no longer supported (as of five days ago).


    All dogma is stupid.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://824248]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (4)
As of 2017-11-18 05:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    In order to be able to say "I know Perl", you must have:













    Results (277 votes). Check out past polls.

    Notices?