⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch12_10.htm

📁 By Tom Christiansen and Nathan Torkington ISBN 1-56592-243-3 First Edition, published August 1998
💻 HTM
字号:
<HTML><HEAD><TITLE>Recipe 12.9. Speeding Module Loading with SelfLoader (Perl Cookbook)</TITLE><METANAME="DC.title"CONTENT="Perl Cookbook"><METANAME="DC.creator"CONTENT="Tom Christiansen &amp; Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly &amp; Associates, Inc."><METANAME="DC.date"CONTENT="1999-07-02T01:41:44Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-243-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch12_01.htm"TITLE="12. Packages, Libraries, and Modules"><LINKREL="prev"HREF="ch12_09.htm"TITLE="12.8. Preparing a Module for Distribution"><LINKREL="next"HREF="ch12_11.htm"TITLE="12.10. Speeding Up Module Loading with Autoloader"></HEAD><BODYBGCOLOR="#FFFFFF"><img alt="Book Home" border="0" src="gifs/smbanner.gif" usemap="#banner-map" /><map name="banner-map"><area shape="rect" coords="1,-2,616,66" href="index.htm" alt="Perl Cookbook"><area shape="rect" coords="629,-11,726,25" href="jobjects/fsearch.htm" alt="Search this book" /></map><div class="navbar"><p><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch12_09.htm"TITLE="12.8. Preparing a Module for Distribution"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 12.8. Preparing a Module for Distribution"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch12_01.htm"TITLE="12. Packages, Libraries, and Modules"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch12_11.htm"TITLE="12.10. Speeding Up Module Loading with Autoloader"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 12.10. Speeding Up Module Loading with Autoloader"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch12-40999">12.9. Speeding Module Loading with SelfLoader</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch12-pgfId-1012">Problem<ACLASS="indexterm"NAME="ch12-idx-1000005245-0"></A><ACLASS="indexterm"NAME="ch12-idx-1000005245-1"></A></A></H3><PCLASS="para">You'd like to load a very large module quickly.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch12-pgfId-1018">Solution</A></H3><PCLASS="para">Use the SelfLoader module:</P><PRECLASS="programlisting">require Exporter;require SelfLoader;@ISA = qw(Exporter SelfLoader);## other initialization or declarations here#__DATA__sub abc { .... }sub def { .... }</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch12-pgfId-1042">Discussion</A></H3><PCLASS="para">When you load a module using <CODECLASS="literal">require</CODE> or <CODECLASS="literal">use</CODE>, the entire module file must be read and compiled (into internal parse trees, not into byte code or native machine code) right then. For very large modules, this annoying delay is unnecessary if you need only a few functions from a particular file.</P><PCLASS="para">To address this problem, the SelfLoader module delays compilation of each subroutine until it is actually called. SelfLoader is easy to use: just place your module's subroutines underneath the <CODECLASS="literal">__DATA__</CODE> marker so the compiler will ignore them, use a <CODECLASS="literal">require</CODE> to pull in the SelfLoader, and include SelfLoader in the module's <CODECLASS="literal">@ISA</CODE> array. That's all there is to it. When your module is loaded, the SelfLoader creates stub functions for all the routines below <CODECLASS="literal">__DATA__</CODE>. The first time a function gets called, the stub replaces itself by compiling the real function and then calling it.</P><PCLASS="para">There is one significant restriction on modules that employ the SelfLoader (or the AutoLoader for that matter, which is described in <ACLASS="xref"HREF="ch12_11.htm"TITLE="Speeding Up Module Loading with Autoloader">Recipe 12.10</A>). SelfLoaded or AutoLoaded subroutines have no access to lexical variables in the file whose <CODECLASS="literal">__DATA__</CODE> block they are in because they are compiled via <CODECLASS="literal">eval</CODE> in an imported AUTOLOAD block. Such dynamically generated subroutines are therefore compiled in the scope of SelfLoader's or AutoLoader's AUTOLOAD.</P><PCLASS="para">Whether using the SelfLoader helps or hinders performance depends on how many subroutines the module has, how large they are, and whether they'll all end up getting called over the lifetime of the program or not.</P><PCLASS="para">You should initially develop and test your module without the SelfLoader. Commenting out the <CODECLASS="literal">__DATA__</CODE> line will take care of that, allowing those functions to be visible at compile time.<ACLASS="indexterm"NAME="ch12-idx-1000005247-0"></A><ACLASS="indexterm"NAME="ch12-idx-1000005247-1"></A></P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch12-pgfId-1056">See Also</A></H3><PCLASS="para">The documentation for the standard module SelfLoader, also in <ACLASS="olink"HREF="../prog/ch07_01.htm">Chapter 7</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A>; <ACLASS="xref"HREF="ch12_11.htm"TITLE="Speeding Up Module Loading with Autoloader">Recipe 12.10</A></P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch12_09.htm"TITLE="12.8. Preparing a Module for Distribution"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 12.8. Preparing a Module for Distribution"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="book"HREF="index.htm"TITLE="Perl Cookbook"><IMGSRC="../gifs/txthome.gif"ALT="Perl Cookbook"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch12_11.htm"TITLE="12.10. Speeding Up Module Loading with Autoloader"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 12.10. Speeding Up Module Loading with Autoloader"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">12.8. Preparing a Module for Distribution</TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="index"HREF="index/index.htm"TITLE="Book Index"><IMGSRC="../gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228">12.10. Speeding Up Module Loading with Autoloader</TD></TR></TABLE><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><FONTSIZE="-1"></DIV<!-- LIBRARY NAV BAR --> <img src="../gifs/smnavbar.gif" usemap="#library-map" border="0" alt="Library Navigation Links"><p> <a href="copyrght.htm">Copyright &copy; 2002</a> O'Reilly &amp; Associates. All rights reserved.</font> </p> <map name="library-map"> <area shape="rect" coords="1,0,85,94" href="../index.htm"><area shape="rect" coords="86,1,178,103" href="../lwp/index.htm"><area shape="rect" coords="180,0,265,103" href="../lperl/index.htm"><area shape="rect" coords="267,0,353,105" href="../perlnut/index.htm"><area shape="rect" coords="354,1,446,115" href="../prog/index.htm"><area shape="rect" coords="448,0,526,132" href="../tk/index.htm"><area shape="rect" coords="528,1,615,119" href="../cookbook/index.htm"><area shape="rect" coords="617,0,690,135" href="../pxml/index.htm"></map> </BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -