• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. exists vs. member vs. memq

Stats

  • Locked Locked
  • Replies 3
  • Subscribers 143
  • Views 18907
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

exists vs. member vs. memq

Yaosan
Yaosan over 14 years ago

When checking if certain item can be found in a list, we can use either exists or member:

exists( i '("a" "b" "c") i == "b" )

member( "b" '("a" "b" "c") )

I'm wondering if one of them is faster than the other.Since SKILL Lint always suggest to use memq instead of member,using exists will avoid those suggestion from showing up.

Now that we have a list of string, memq can't be used. Does it make sense to convert our list of string to list of symbol first then use memq to optimize this process? (assume the list can be short or very long i.e. more than 500 elements)

For example:

myList = '("a" "b" "c")
memq( 'b foreach( mapcar i myList concat(i) ) )

As mentioned in the beginning, all we care is if an item can be found in the list i.e. whether the return is nil or non-nil. Thanks for any feedback.

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 14 years ago

    member is likely to be faster than exists, because it is more specific. The comparison is built-in, whereas the comparison has to be explicitly stated with exists(). But you could profile it to be sure.

    The main benefit of memq would be if you are searching for a list within the list - and you know for certain that the list exists (as exactly the same list, not just a list with the same values) within the list you're searching. Converting a lot of strings to symbols is likely to be expensive, pollute the global symbol table, and be slower than justusing member.

     

    Regards,

     

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • dmay
    dmay over 14 years ago

    If performance is most important, then use a table.

    myTbl = makeTable("myTbl" nil)
    myTbl["a"]=t
    myTbl["b"]=t
    myTbl["c"]=t
    or
    foreach(item myList
        myTbl[item]=t
    )
    then check for existence in the table:
    if(myTbl[x] then ...

    The table will be MUCH faster than using member/memq/exists for lists.

    Derek

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel
  • Yaosan
    Yaosan over 14 years ago

    Thanks for the reply Andrew, it's very insightful and based on what you said, it seems like using member() will be the most intuitive and optimized way to do things.

    And I would love to try what Derek suggested i.e. using table instead of list to do this type of operations. Thanks for the suggestion and I will try to post back once I gave this a try. It will be nice to have some actual numbers that show the speed differences.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information