I think it generally depends on the cause of the duplicate. If its system issue then you'll forever be creating 301s for your urls. In that case its best to avoid having to do the 301 and stick with canonical. With canonical are telling the search engine to only index one version of the url.
Both 301 and canonical have their uses but the choice should depend on the issue and what you are trying to achieve. Hope this helps?
Duke