Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.perl.misc > #8737

Re: the fastest way to create a directory

From Rainer Weikusat <rweikusat@mssgmbh.com>
Newsgroups comp.lang.perl.misc
Subject Re: the fastest way to create a directory
Date 2013-07-17 10:49 +0100
Message-ID <87mwplo6sj.fsf@sapphire.mobileactivedefense.com> (permalink)
References <ks0l7j$9j4$1@news.ntua.gr> <kbaeba-dfc1.ln1@anubis.morrow.me.uk> <slrnkubflf.ef9.hjp-usenet3@hrunkner.hjp.at>

Show all headers | View raw


"Peter J. Holzer" <hjp-usenet3@hjp.at> writes:
> On 2013-07-15 22:40, Ben Morrow <ben@morrow.me.uk> wrote:
>> Quoth George Mpouras <nospam.gravitalsun.noadsplease@hotmail.noads.com>:
>>> Create a directory with all upper directories if missing.
>>> it uses the minimum possible disk access and checks.
>>> 
>>> Mkdir_recursive('/some/dir/d1/d2') or die;
>>> 
>>> sub Mkdir_recursive
>>> {
>>> return 1 if $_[0] eq '' || -d $_[0];
>>> Mkdir_recursive( $_[0] =~/^(.*?)[\\\/][^\\\/]+$/ ) || return undef;
>>> mkdir $_[0] || return undef
>>> }
>>
>> You'd be better off calling mkdir blind and keying off $! if it fails.
>> That way you save a stat in the case where the creation succeeds.
>
> That shouldn't make a noticeable difference. If the stat does cause any
> disk accesses, those would also have been caused by the mkdir, and if it
> doesn't (i.e. everything is already in the cache) the time for the stat
> calls is completely swamped by the mkdir's.

Both stat and mkdir are system calls and 'one system call' is going to
be faster than 'two system calls'. 'In certain situations' (eg, for
the FFS and UFS filesystems or one of the Linux ext? mounted with the
dirsync option), mkdir will be executed synchronously and then, it is
going to take a 'long' time (possibly, an infinitely/ arbitrary long
time for storage devices expected to fail routinely during normal
operation where the error handling method is 'retry until successful
or powered down' aka SSDs). But all these ought to be regarded as
corner case and "everything's in the cache" the general one and in
this case, Ben's suggestion is sensible if it is expected that
directories a more often created than not created.

I don't think I'd use recursion for that because an iterative
equivalent is still fairly simple, example

------------------
use Errno qw(EEXIST ENOTDIR);

sub mkdir_p
{
    my ($cur, $next, $remain);

    $remain = $_[0];
    while ($remain) {
	($next, $remain) = $remain =~ /^(\/*[^\/]*)(.*)/;
	$cur .= $next;
	
	mkdir($cur) or do {
	    return if $! != EEXIST;
	    next if $remain;
	    
	    -d($cur) or $! = ENOTDIR, return;
	};
    }

    return 1;
}

mkdir_p($ARGV[0]) or die("$!");
--------------------

NB: I didn't perform any benchmarks on this. But it works with
pathnames a la /////b/c///d/e//g while the original doesn't (OTOH, it
doesn't support MS-DOSE [German for 'tin'] but that's not my problem
:-).

Back to comp.lang.perl.misc | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

the fastest way to create a directory George Mpouras <nospam.gravitalsun.noadsplease@hotmail.noads.com> - 2013-07-15 14:09 +0300
  Re: the fastest way to create a directory Henry Law <news@lawshouse.org> - 2013-07-15 15:44 +0100
    Re: the fastest way to create a directory "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-15 18:45 +0300
      Re: the fastest way to create a directory Charlton Wilbur <cwilbur@chromatico.net> - 2013-07-15 15:36 -0400
        Re: the fastest way to create a directory "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-16 00:07 +0300
      Re: the fastest way to create a directory "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2013-07-15 23:55 +0200
  Re: the fastest way to create a directory tmcd@panix.com (Tim McDaniel) - 2013-07-15 20:27 +0000
    Re: the fastest way to create a directory "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-16 00:04 +0300
      Re: the fastest way to create a directory "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2013-07-16 00:02 +0200
        Re: the fastest way to create a directory "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-18 00:16 +0300
      Re: the fastest way to create a directory tmcd@panix.com (Tim McDaniel) - 2013-07-15 22:16 +0000
      Re: the fastest way to create a directory Charlton Wilbur <cwilbur@chromatico.net> - 2013-07-18 15:49 -0400
        Re: the fastest way to create a directory Henry Law <news@lawshouse.org> - 2013-07-18 21:47 +0100
          Re: the fastest way to create a directory "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2013-07-19 15:25 +0200
            Re: the fastest way to create a directory Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-19 14:51 +0100
            Re: the fastest way to create a directory Keith Keller <kkeller-usenet@wombat.san-francisco.ca.us> - 2013-07-19 08:39 -0700
          Re: the fastest way to create a directory Charlton Wilbur <cwilbur@chromatico.net> - 2013-07-21 23:19 -0400
            Re: the fastest way to create a directory Henry Law <news@lawshouse.org> - 2013-07-22 07:10 +0100
              Re: the fastest way to create a directory Charlton Wilbur <cwilbur@chromatico.net> - 2013-07-22 17:31 -0400
        Re: the fastest way to create a directory Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-19 16:40 +0100
  Re: the fastest way to create a directory Ben Morrow <ben@morrow.me.uk> - 2013-07-15 23:40 +0100
    Re: the fastest way to create a directory "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2013-07-16 23:44 +0200
      Re: the fastest way to create a directory George Mpouras <nospam.gravitalsun.noadsplease@hotmail.noads.com> - 2013-07-17 11:09 +0300
        Re: the fastest way to create a directory "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2013-07-17 10:24 +0200
      Re: the fastest way to create a directory George Mpouras <nospam.gravitalsun.noadsplease@hotmail.noads.com> - 2013-07-17 11:10 +0300
      Re: the fastest way to create a directory Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-17 10:49 +0100
        Re: the fastest way to create a directory "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2013-07-17 22:37 +0200
          Re: the fastest way to create a directory Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-17 22:22 +0100
          Re: the fastest way to create a directory Ben Morrow <ben@morrow.me.uk> - 2013-07-19 16:21 +0100
            Re: the fastest way to create a directory "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2013-07-19 22:11 +0200
        Re: the fastest way to create a directory "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-18 00:14 +0300
          Re: the fastest way to create a directory tmcd@panix.com (Tim McDaniel) - 2013-07-17 21:21 +0000
          Re: the fastest way to create a directory Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-17 22:31 +0100
            Re: the fastest way to create a directory "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-19 00:02 +0300
              Re: the fastest way to create a directory Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-19 10:46 +0100
                Re: the fastest way to create a directory Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-19 10:51 +0100
                Re: the fastest way to create a directory Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-19 12:09 +0100
          Re: the fastest way to create a directory Keith Keller <kkeller-usenet@wombat.san-francisco.ca.us> - 2013-07-17 22:37 -0700
            Re: the fastest way to create a directory Justin C <justin.1303@purestblue.com> - 2013-07-18 09:15 +0100
  Re: the fastest way to create a directory "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-19 01:01 +0300
    Re: the fastest way to create a directory "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-19 01:07 +0300
  Re: the fastest way to create a directory "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-23 09:33 +0300

csiph-web