| There are a few different places where we make excessive numbers of Pathname objects and resulting Strings: 1. Most of Puppet's FileSystem methods make two copies of their string arguments. Once to create the Pathname instance (via assert_path) and another when ruby's File.xxx method calls Pathname#to_path to get the original string back. 2. Some of Puppet's FileSystem implementation, eg Windows#replace_file, methods call "back out" to Puppet::FileSystem.replace_file, which makes another copy of Pathname instead of using the existing instance. 3. Checker4_0#namespace_for_file(file) creates N Pathname instances (one for each module path directory in the environment) for each file argument. And then calls Pathname#cleanpath and Pathname#relative_path_from, both of which resolve each path component, e.g. "/a/b/c/d/etc" is copied to "/a/b/c/d", "/a/b/c", "/a/b", "/a", "". The mapping of file to namespace is cached in the environment, but if you have M files in an environment, then we get N * M Pathname instances and N * M * P string copies. 4. PathNamePattern calls Pathname.each_filename to determine if any path component contains ... That ends up calling Pathname#chop_basename. We should just call String.split. It also calls Pathname#to_s multiple times during validation. |