Google's John Mueller said in a Google Webmaster Help thread that the canonical tag, used to inform search engines a URL has moved, is slower for Google to pick up on than if they used a 301 redirect.
John explained that Google would first have to crawl and index the first page to understand that there is a canonical tag on the page. Once they crawl it and understand the canonical tag, then they can add to their index that the page has moved.
If you used a 301 redirect, the spider would automatically be redirected from the original page to the new page, so there would be no indexing or crawling of the original page to determine if there is a canonical tag on that page.
This all makes logical sense, but I don't know if it was stated in black and white yet by Google.
When we initially crawl a URL, we'll generally index it with that URL first. A rel=canonical link element is not the same as a 301 redirect, so it will take more time for us to pick up on the final target, to crawl and to index that instead of the original URL. In general, that doesn't matter though - as long as the content is indexed, it'll be found, even with a "cid" attached.
He also added an important point for those who are doing mass usage of the canonical tag. He said:
If you are using this for canonicalization, keep in mind that we will still have to crawl all of those copies first, so depending on your site, that might be a significant load on your server (and it will slow down crawling and indexing of all of your content). If there's any way for you to remove session-ID parameters from internal links (assuming that's what the "cid" is), then that's something I'd strongly recommend working on. Having a site that is clear of unnecessary URL parameters will always make it easier to crawl and index.
So keep that in mind as well. It is not just slower for Google to pick up on but also may really impact your server resources, more so than a 301 redirect or making sure your site structure is solid.
Forum discussion at Google Webmaster Help.