in

SDT Community Server

SDT Forums, Blogs, Photos server.

Coolboy

December 2008 - Posts

  • 高性能网页开发新20条规则详解

    转载自CSDN

    因需要登陆和发送资料才给看,所以转在这里

    太多了,不知道怎样转..

    http://developer.yahoo.com/performance/rules.html

    http://blog.csdn.net/zlb789/archive/2008/12/21/3568187.aspx

    1. Use a Content Delivery Network
    2. Add an Expires or a Cache-Control Header
    3. Gzip Components
    4. Put Stylesheets at the Top
    5. Put Scripts at the Bottom
    6. Avoid CSS Expressions
    7. Make JavaScript and CSS External
    8. Reduce DNS Lookups
    9. Minify JavaScript and CSS
    10. Avoid Redirects
    11. Remove Duplicate Scripts
    12. Configure ETags
    13. Make Ajax Cacheable
    14. Flush the Buffer Early
    15. Use GET for AJAX Requests
    16. Post-load Components
    17. Preload Components
    18. Reduce the Number of DOM Elements
    19. Split Components Across Domains
    20. Minimize the Number of iframes
    21. No 404s
    22. Reduce Cookie Size
    23. Use Cookie-free Domains for Components
    24. Minimize DOM Access
    25. Develop Smart Event Handlers
    26. Choose <link> over @import
    27. Avoid Filters
    28. Optimize Images
    29. Optimize CSS Sprites
    30. Don't Scale Images in HTML
    31. Make favicon.ico Small and Cacheable
    32. Keep Components under 25K
    33. Pack Components into a Multipart Document

     

    Minimize HTTP Requests

    tag: content

    80% of the end-user response time is spent on the front-end. Most of this time is tied up in downloading all the components in the page: images, stylesheets, scripts, Flash, etc. Reducing the number of components in turn reduces the number of HTTP requests required to render the page. This is the key to faster pages.

    One way to reduce the number of components in the page is to simplify the page's design. But is there a way to build pages with richer content while also achieving fast response times? Here are some techniques for reducing the number of HTTP requests, while still supporting rich page designs.

    Combined files are a way to reduce the number of HTTP requests by combining all scripts into a single script, and similarly combining all CSS into a single stylesheet. Combining files is more challenging when the scripts and stylesheets vary from page to page, but making this part of your release process improves response times.

    CSS Sprites are the preferred method for reducing the number of image requests. Combine your background images into a single image and use the CSS background-image and background-position properties to display the desired image segment.

    Image maps combine multiple images into a single image. The overall size is about the same, but reducing the number of HTTP requests speeds up the page. Image maps only work if the images are contiguous in the page, such as a navigation bar. Defining the coordinates of image maps can be tedious and error prone. Using image maps for navigation is not accessible too, so it's not recommended.

    Inline images use the data: URL scheme to embed the image data in the actual page. This can increase the size of your HTML document. Combining inline images into your (cached) stylesheets is a way to reduce HTTP requests and avoid increasing the size of your pages. Inline images are not yet supported across all major browsers.

    Reducing the number of HTTP requests in your page is the place to start. This is the most important guideline for improving performance for first time visitors. As described in Tenni Theurer's blog post Browser Cache Usage - Exposed!, 40-60% of daily visitors to your site come in with an empty cache. Making your page fast for these first time visitors is key to a better user experience.

    top | discuss this rule

    Use a Content Delivery Network

    tag: server

    The user's proximity to your web server has an impact on response times. Deploying your content across multiple, geographically dispersed servers will make your pages load faster from the user's perspective. But where should you start?

    As a first step to implementing geographically dispersed content, don't attempt to redesign your web application to work in a distributed architecture. Depending on the application, changing the architecture could include daunting tasks such as synchronizing session state and replicating database transactions across server locations. Attempts to reduce the distance between users and your content could be delayed by, or never pass, this application architecture step.

    Remember that 80-90% of the end-user response time is spent downloading all the components in the page: images, stylesheets, scripts, Flash, etc. This is the Performance Golden Rule. Rather than starting with the difficult task of redesigning your application architecture, it's better to first disperse your static content. This not only achieves a bigger reduction in response times, but it's easier thanks to content delivery networks.

    A content delivery network (CDN) is a collection of web servers distributed across multiple locations to deliver content more efficiently to users. The server selected for delivering content to a specific user is typically based on a measure of network proximity. For example, the server with the fewest network hops or the server with the quickest response time is chosen.

    Some large Internet companies own their own CDN, but it's cost-effective to use a CDN service provider, such as Akamai Technologies, Mirror Image Internet, or Limelight Networks. For start-up companies and private web sites, the cost of a CDN service can be prohibitive, but as your target audience grows larger and becomes more global, a CDN is necessary to achieve fast response times. At Yahoo!, properties that moved static content off their application web servers to a CDN improved end-user response times by 20% or more. Switching to a CDN is a relatively easy code change that will dramatically improve the speed of your web site.

    top | discuss this rule

    Add an Expires or a Cache-Control Header

    tag: server

    There are two things in this rule:

    • For static components: implement "Never expire" policy by setting far future Expires header
    • For dynamic components: use an appropriate Cache-Control header to help the browser with conditional requests

    Web page designs are getting richer and richer, which means more scripts, stylesheets, images, and Flash in the page. A first-time visitor to your page may have to make several HTTP requests, but by using the Expires header you make those components cacheable. This avoids unnecessary HTTP requests on subsequent page views. Expires headers are most often used with images, but they should be used on all components including scripts, stylesheets, and Flash components.

    Browsers (and proxies) use a cache to reduce the number and size of HTTP requests, making web pages load faster. A web server uses the Expires header in the HTTP response to tell the client how long a component can be cached. This is a far future Expires header, telling the browser that this response won't be stale until April 15, 2010.

          Expires: Thu, 15 Apr 2010 20:00:00 GMT

     

    If your server is Apache, use the ExpiresDefault directive to set an expiration date relative to the current date. This example of the ExpiresDefault directive sets the Expires date 10 years out from the time of the request.

          ExpiresDefault "access plus 10 years"

     

    Keep in mind, if you use a far future Expires header you have to change the component's filename whenever the component changes. At Yahoo! we often make this step part of the build process: a version number is embedded in the component's filename, for example, yahoo_2.0.6.js.

    Using a far future Expires header affects page views only after a user has already visited your site. It has no effect on the number of HTTP requests when a user visits your site for the first time and the browser's cache is empty. Therefore the impact of this performance improvement depends on how often users hit your pages with a primed cache. (A "primed cache" already contains all of the components in the page.) We measured this at Yahoo! and found the number of page views with a primed cache is 75-85%. By using a far future Expires header, you increase the number of components that are cached by the browser and re-used on subsequent page views without sending a single byte over the user's Internet connection.

    top | discuss this rule

    Gzip Components

    tag: server

    The time it takes to transfer an HTTP request and response across the network can be significantly reduced by decisions made by front-end engineers. It's true that the end-user's bandwidth speed, Internet service provider, proximity to peering exchange points, etc. are beyond the control of the development team. But there are other variables that affect response times. Compression reduces response times by reducing the size of the HTTP response.

    Starting with HTTP/1.1, web clients indicate support for compression with the Accept-Encoding header in the HTTP request.

          Accept-Encoding: gzip, deflate

    If the web server sees this header in the request, it may compress the response using one of the methods listed by the client. The web server notifies the web client of this via the Content-Encoding header in the response.

          Content-Encoding: gzip

    Gzip is the most popular and effective compression method at this time. It was developed by the GNU project and standardized by RFC 1952. The only other compression format you're likely to see is deflate, but it's less effective and less popular.

    Gzipping generally reduces the response size by about 70%. Approximately 90% of today's Internet traffic travels through browsers that claim to support gzip. If you use Apache, the module configuring gzip depends on your version: Apache 1.3 uses mod_gzip while Apache 2.x uses mod_deflate.

    There are known issues with browsers and proxies that may cause a mismatch in what the browser expects and what it receives with regard to compressed content. Fortunately, these edge cases are dwindling as the use of older browsers drops off. The Apache modules help out by adding appropriate Vary response headers automatically.

    Servers choose what to gzip based on file type, but are typically too limited in what they decide to compress. Most web sites gzip their HTML documents. It's also worthwhile to gzip your scripts and stylesheets, but many web sites miss this opportunity. In fact, it's worthwhile to compress any text response including XML and JSON. Image and PDF files should not be gzipped because they are already compressed. Trying to gzip them not only wastes CPU but can potentially increase file sizes.

    Gzipping as many file types as possible is an easy way to reduce page weight and accelerate the user experience.

    top | discuss this rule

    Put Stylesheets at the Top

    tag: css

    While researching performance at Yahoo!, we discovered that moving stylesheets to the document HEAD makes pages appear to be loading faster. This is because putting stylesheets in the HEAD allows the page to render progressively.

    Front-end engineers that care about performance want a page to load progressively; that is, we want the browser to display whatever content it has as soon as possible. This is especially important for pages with a lot of content and for users on slower Internet connections. The importance of giving users visual feedback, such as progress indicators, has been well researched and documented. In our case the HTML page is the progress indicator! When the browser loads the page progressively the header, the navigation bar, the logo at the top, etc. all serve as visual feedback for the user who is waiting for the page. This improves the overall user experience.

    The problem with putting stylesheets near the bottom of the document is that it prohibits progressive rendering in many browsers, including Internet Explorer. These browsers block rendering to avoid having to redraw elements of the page if their styles change. The user is stuck viewing a blank white page.

    The HTML specification clearly states that stylesheets are to be included in the HEAD of the page: "Unlike A, [LINK] may only appear in the HEAD section of a document, although it may appear any number of times." Neither of the alternatives, the blank white screen or flash of unstyled content, are worth the risk. The optimal solution is to follow the HTML specification and load your stylesheets in the document HEAD.

    top | discuss this rule

    Put Scripts at the Bottom

    tag: javascript

    The problem caused by scripts is that they block parallel downloads. The HTTP/1.1 specification suggests that browsers download no more than two components in parallel per hostname. If you serve your images from multiple hostnames, you can get more than two downloads to occur in parallel. While a script is downloading, however, the browser won't start any other downloads, even on different hostnames.

    In some situations it's not easy to move scripts to the bottom. If, for example, the script uses document.write to insert part of the page's content, it can't be moved lower in the page. There might also be scoping issues. In many cases, there are ways to workaround these situations.

    An alternative suggestion that often comes up is to use deferred scripts. The DEFER attribute indicates that the script does not contain document.write, and is a clue to browsers that they can continue rendering. Unfortunately, Firefox doesn't support the DEFER attribute. In Internet Explorer, the script may be deferred, but not as much as desired. If a script can be deferred, it can also be moved to the bottom of the page. That will make your web pages load faster.

    top | discuss this rule

    Avoid CSS Expressions

    tag: css

    CSS expressions are a powerful (and dangerous) way to set CSS properties dynamically. They're supported in Internet Explorer, starting with version 5. As an example, the background color could be set to alternate every hour using CSS expressions.

          background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );

     

    As shown here, the expression method accepts a JavaScript expression. The CSS property is set to the result of evaluating the JavaScript expression. The expression method is ignored by other browsers, so it is useful for setting properties in Internet Explorer needed to create a consistent experience across browsers.

    The problem with expressions is that they are evaluated more frequently than most people expect. Not only are they evaluated when the page is rendered and resized, but also when the page is scrolled and even when the user moves the mouse over the page. Adding a counter to the CSS expression allows us to keep track of when and how often a CSS expression is evaluated. Moving the mouse around the page can easily generate more than 10,000 evaluations.

    One way to reduce the number of times your CSS expression is evaluated is to use one-time expressions, where the first time the expression is evaluated it sets the style property to an explicit value, which replaces the CSS expression. If the style property must be set dynamically throughout the life of the page, using event handlers instead of CSS expressions is an alternative approach. If you must use CSS expressions, remember that they may be evaluated thousands of times and could affect the performance of your page.

    top | discuss this rule

    Make JavaScript and CSS External

    tag: javascript, css

    Many of these performance rules deal with how external components are managed. However, before these considerations arise you should ask a more basic question: Should JavaScript and CSS be contained in external files, or inlined in the page itself?

    Using external files in the real world generally produces faster pages because the JavaScript and CSS files are cached by the browser. JavaScript and CSS that are inlined in HTML documents get downloaded every time the HTML document is requested. This reduces the number of HTTP requests that are needed, but increases the size of the HTML document. On the other hand, if the JavaScript and CSS are in external files cached by the browser, the size of the HTML document is reduced without increasing the number of HTTP requests.

    The key factor, then, is the frequency with which external JavaScript and CSS components are cached relative to the number of HTML documents requested. This factor, although difficult to quantify, can be gauged using various metrics. If users on your site have multiple page views per session and many of your pages re-use the same scripts and stylesheets, there is a greater potential benefit from cached external files.

    Many web sites fall in the middle of these metrics. For these sites, the best solution generally is to deploy the JavaScript and CSS as external files. The only exception where inlining is preferable is with home pages, such as Yahoo!'s front page and My Yahoo!. Home pages that have few (perhaps only one) page view per session may find that inlining JavaScript and CSS results in faster end-user response times.

    For front pages that are typically the first of many page views, there are techniques that leverage the reduction of HTTP requests that inlining provides, as well as the caching benefits achieved through using external files. One such technique is to inline JavaScript and CSS in the front page, but dynamically download the external files after the page has finished loading. Subsequent pages would reference the external files that should already be in the browser's cache.

    top | discuss this rule

    Reduce DNS Lookups

    tag: content

    The Domain Name System (DNS) maps hostnames to IP addresses, just as phonebooks map people's names to their phone numbers. When you type www.yahoo.com into your browser, a DNS resolver contacted by the browser returns that server's IP address. DNS has a cost. It typically takes 20-120 milliseconds for DNS to lookup the IP address for a given hostname. The browser can't download anything from this hostname until the DNS lookup is completed.

    DNS lookups are cached for better performance. This caching can occur on a special caching server, maintained by the user's ISP or local area network, but there is also caching that occurs on the individual user's computer. The DNS information remains in the operating system's DNS cache (the "DNS Client service" on Microsoft Windows). Most browsers have their own caches, separate from the operating system's cache. As long as the browser keeps a DNS record in its own cache, it doesn't bother the operating system with a request for the record.

    Internet Explorer caches DNS lookups for 30 minutes by default, as specified by the DnsCacheTimeout registry setting. Firefox caches DNS lookups for 1 minute, controlled by the network.dnsCacheExpiration configuration setting. (Fasterfox changes this to 1 hour.)

    When the client's DNS cache is empty (for both the browser and the operating system), the number of DNS lookups is equal to the number of unique hostnames in the web page. This includes the hostnames used in the page's URL, images, script files, stylesheets, Flash objects, etc. Reducing the number of unique hostnames reduces the number of DNS lookups.

    Reducing the number of unique hostnames has the potential to reduce the amount of parallel downloading that takes place in the page. Avoiding DNS lookups cuts response times, but reducing parallel downloads may increase response times. My guideline is to split these components across at least two but no more than four hostnames. This results in a good compromise between reducing DNS lookups and allowing a high degree of parallel downloads.

    top | discuss this rule

    Minify JavaScript and CSS

    tag: javascript, css

    Minification is the practice of removing unnecessary characters from code to reduce its size thereby improving load times. When code is minified all comments are removed, as well as unneeded white space characters (space, newline, and tab). In the case of JavaScript, this improves response time performance because the size of the downloaded file is reduced. Two popular tools for minifying JavaScript code are JSMin and YUI Compressor. The YUI compressor can also minify CSS.

    Obfuscation is an alternative optimization that can be applied to source code. It's more complex than minification and thus more likely to generate bugs as a result of the obfuscation step itself. In a survey of ten top U.S. web sites, minification achieved a 21% size reduction versus 25% for obfuscation. Although obfuscation has a higher size reduction, minifying JavaScript is less risky.

    In addition to minifying external scripts and styles, inlined <script> and <style> blocks can and should also be minified. Even if you gzip your scripts and styles, minifying them will still reduce the size by 5% or more. As the use and size of JavaScript and CSS increases, so will the savings gained by minifying your code.

    top | discuss this rule

    Avoid Redirects

    tag: content

    Redirects are accomplished using the 301 and 302 status codes. Here's an example of the HTTP headers in a 301 response:

          HTTP/1.1 301 Moved Permanently
          Location: http://example.com/newuri
          Content-Type: text/html

     

    The browser automatically takes the user to the URL specified in the Location field. All the information necessary for a redirect is in the headers. The body of the response is typically empty. Despite their names, neither a 301 nor a 302 response is cached in practice unless additional headers, such as Expires or Cache-Control, indicate it should be. The meta refresh tag and JavaScript are other ways to direct users to a different URL, but if you must do a redirect, the preferred technique is to use the standard 3xx HTTP status codes, primarily to ensure the back button works correctly.

    The main thing to remember is that redirects slow down the user experience. Inserting a redirect between the user and the HTML document delays everything in the page since nothing in the page can be rendered and no components can start being downloaded until the HTML document has arrived.

    One of the most wasteful redirects happens frequently and web developers are generally not aware of it. It occurs when a trailing slash (/) is missing from a URL that should otherwise have one. For example, going to http://astrology.yahoo.com/astrology results in a 301 response containing a redirect to http://astrology.yahoo.com/astrology/ (notice the added trailing slash). This is fixed in Apache by using Alias or mod_rewrite, or the DirectorySlash directive if you're using Apache handlers.

    Connecting an old web site to a new one is another common use for redirects. Others include connecting different parts of a website and directing the user based on certain conditions (type of browser, type of user account, etc.). Using a redirect to connect two web sites is simple and requires little additional coding. Although using redirects in these situations reduces the complexity for developers, it degrades the user experience. Alternatives for this use of redirects include using Alias and mod_rewrite if the two code paths are hosted on the same server. If a domain name change is the cause of using redirects, an alternative is to create a CNAME (a DNS record that creates an alias pointing from one domain name to another) in combination with Alias or mod_rewrite.

    top | discuss this rule

    Remove Duplicate Scripts

    tag: javascript

    It hurts performance to include the same JavaScript file twice in one page. This isn't as unusual as you might think. A review of the ten top U.S. web sites shows that two of them contain a duplicated script. Two main factors increase the odds of a script being duplicated in a single web page: team size and number of scripts. When it does happen, duplicate scripts hurt performance by creating unnecessary HTTP requests and wasted JavaScript execution.

    Unnecessary HTTP requests happen in Internet Explorer, but not in Firefox. In Internet Explorer, if an external script is included twice and is not cacheable, it generates two HTTP requests during page loading. Even if the script is cacheable, extra HTTP requests occur when the user reloads the page.

    In addition to generating wasteful HTTP requests, time is wasted evaluating the script multiple times. This redundant JavaScript execution happens in both Firefox and Internet Explorer, regardless of whether the script is cacheable.

    One way to avoid accidentally including the same script twice is to implement a script management module in your templating system. The typical way to include a script is to use the SCRIPT tag in your HTML page.

          <script type="text/javascript" src="menu_1.0.17.js"></script>

    An alternative in PHP would be to create a function called insertScript.

          <?php insertScript("menu.js") ?>

    In addition to preventing the same script from being inserted multiple times, this function could handle other issues with scripts, such as dependency checking and adding version numbers to script filenames to support far future Expires headers.

    top | discuss this rule

    Configure ETags

    tag: server

    Entity tags (ETags) are a mechanism that web servers and browsers use to determine whether the component in the browser's cache matches the one on the origin server. (An "entity" is another word a "component": images, scripts, stylesheets, etc.) ETags were added to provide a mechanism for validating entities that is more flexible than the last-modified date. An ETag is a string that uniquely identifies a specific version of a component. The only format constraints are that the string be quoted. The origin server specifies the component's ETag using the ETag response header.

          HTTP/1.1 200 OK
          Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
          ETag: "10c24bc-4ab-457e1c1f"
          Content-Length: 12195

     

    Later, if the browser has to validate a component, it uses the If-None-Match header to pass the ETag back to the origin server. If the ETags match, a 304 status code is returned reducing the response by 12195 bytes for this example.

          GET /i/yahoo.gif HTTP/1.1
          Host: us.yimg.com
          If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
          If-None-Match: "10c24bc-4ab-457e1c1f"
          HTTP/1.1 304 Not Modified

     

    The problem with ETags is that they typically are constructed using attributes that make them unique to a specific server hosting a site. ETags won't match when a browser gets the original component from one server and later tries to validate that component on a different server, a situation that is all too common on Web sites that use a cluster of servers to handle requests. By default, both Apache and IIS embed data in the ETag that dramatically reduces the odds of the validity test succeeding on web sites with multiple servers.

    The ETag format for Apache 1.3 and 2.x is inode-size-timestamp. Although a given file may reside in the same directory across multiple servers, and have the same file size, permissions, timestamp, etc., its inode is different from one server to the next.

    IIS 5.0 and 6.0 have a similar issue with ETags. The format for ETags on IIS is Filetimestamp:ChangeNumber. A ChangeNumber is a counter used to track configuration changes to IIS. It's unlikely that the ChangeNumber is the same across all IIS servers behind a web site.

    The end result is ETags generated by Apache and IIS for the exact same component won't match from one server to another. If the ETags don't match, the user doesn't receive the small, fast 304 response that ETags were designed for; instead, they'll get a normal 200 response along with all the data for the component. If you host your web site on just one server, this isn't a problem. But if you have multiple servers hosting your web site, and you're using Apache or IIS with the default ETag configuration, your users are getting slower pages, your servers have a higher load, you're consuming greater bandwidth, and proxies aren't caching your content efficiently. Even if your components have a far future Expires header, a conditional GET request is still made whenever the user hits Reload or Refresh.

    If you're not taking advantage of the flexible validation model that ETags provide, it's better to just remove the ETag altogether. The Last-Modified header validates based on the component's timestamp. And removing the ETag reduces the size of the HTTP headers in both the response and subsequent requests. This Microsoft Support article describes how to remove ETags. In Apache, this is done by simply adding the following line to your Apache configuration file:

          FileETag none

    top | discuss this rule

    Make Ajax Cacheable

    tag: content

    One of the cited benefits of Ajax is that it provides instantaneous feedback to the user because it requests information asynchronously from the backend web server. However, using Ajax is no guarantee that the user won't be twiddling his thumbs waiting for those asynchronous JavaScript and XML responses to return. In many applications, whether or not the user is kept waiting depends on how Ajax is used. For example, in a web-based email client the user will be kept waiting for the results of an Ajax request to find all the email messages that match their search criteria. It's important to remember that "asynchronous" does not imply "instantaneous".

    To improve performance, it's important to optimize these Ajax responses. The most important way to improve the performance of Ajax is to make the responses cacheable, as discussed in Add an Expires or a Cache-Control Header. Some of the other rules also apply to Ajax:

     

    Let's look at an example. A Web 2.0 email client might use Ajax to download the user's address book for autocompletion. If the user hasn't modified her address book since the last time she used the email web app, the previous address book response could be read from cache if that Ajax response was made cacheable with a future Expires or Cache-Control header. The browser must be informed when to use a previously cached address book response versus requesting a new one. This could be done by adding a timestamp to the address book Ajax URL indicating the last time the user modified her address book, for example, &t=1190241612. If the address book hasn't been modified since the last download, the timestamp will be the same and the address book will be read from the browser's cache eliminating an extra HTTP roundtrip. If the user has modified her address book, the timestamp ensures the new URL doesn't match the cached response, and the browser will request the updated address book entries.

    Even though your Ajax responses are created dynamically, and might only be applicable to a single user, they can still be cached. Doing so will make your Web 2.0 apps faster.

    top | discuss this rule

    Flush the Buffer Early

    tag: server

    When users request a page, it can take anywhere from 200 to 500ms for the backend server to stitch together the HTML page. During this time, the browser is idle as it waits for the data to arrive. In PHP you have the function flush(). It allows you to send your partially ready HTML response to the browser so that the browser can start fetching components while your backend is busy with the rest of the HTML page. The benefit is mainly seen on busy backends or light frontends.

    A good place to consider flushing is right after the HEAD because the HTML for the head is usually easier to produce and it allows you to include any CSS and JavaScript files for the browser to start fetching in parallel while the backend is still processing.

    Example:

          ... <!-- css, js -->
        </head>
        <?php flush(); ?>
        <body>
          ... <!-- content -->
    

    Yahoo! search pioneered research and real user testing to prove the benefits of using this technique.

    top

    Use GET for AJAX Requests

    tag: server

    The Yahoo! Mail team found that when using XMLHttpRequest, POST is implemented in the browsers as a two-step process: sending the headers first, then sending data. So it's best to use GET, which only takes one TCP packet to send (unless you have a lot of cookies). The maximum URL length in IE is 2K, so if you send more than 2K data you might not be able to use GET.

    An interesting side affect is that POST without actually posting any data behaves like GET. Based on the HTTP specs, GET is meant for retrieving information, so it makes sense (semantically) to use GET when you're only requesting data, as opposed to sending data to be stored server-side.

     

    top

    Post-load Components

    tag: content

    You can take a closer look at your page and ask yourself: "What's absolutely required in order to render the page initially?". The rest of the content and components can wait.

    JavaScript is an ideal candidate for splitting before and after the onload event. For example if you have JavaScript code and libraries that do drag and drop and animations, those can wait, because dragging elements on the page comes after the initial rendering. Other places to look for candidates for post-loading include hidden content (content that appears after a user action) and images below the fold.

    Tools to help you out in your effort: YUI Image Loader allows you to delay images below the fold and the YUI Get utility is an easy way to include JS and CSS on the fly. For an example in the wild take a look at Yahoo! Home Page with Firebug's Net Panel turned on.

    It's good when the performance goals are inline with other web development best practices. In this case, the idea of progressive enhancement tells us that JavaScript, when supported, can improve the user experience but you have to make sure the page works even without JavaScript. So after you've made sure the page works fine, you can enhance it with some post-loaded scripts that give you more bells and whistles such as drag and drop and animations.

    top

    Preload Components

    tag: content

    Preload may look like the opposite of post-load, but it actually has a different goal. By preloading components you can take advantage of the time the browser is idle and request components (like images, styles and scripts) you'll need in the future. This way when the user visits the next page, you could have most of the components already in the cache and your page will load much faster for the user.

    There are actually several types of preloading:

    • Unconditional preload - as soon as onload fires, you go ahead and fetch some extra components. Check google.com for an example of how a sprite image is requested onload. This sprite image is not needed on the google.com homepage, but it is needed on the consecutive search result page.
    • Conditional preload - based on a user action you make an educated guess where the user is headed next and preload accordingly. On search.yahoo.com you can see how some extra components are requested after you start typing in the input box.
    • Anticipated preload - preload in advance before launching a redesign. It often happens after a redesign that you hear: "The new site is cool, but it's slower than before". Part of the problem could be that the users were visiting your old site with a full cache, but the new one is always an empty cache experience. You can mitigate this side effect by preloading some components before you even launched the redesign. Your old site can use the time the browser is idle and request images and scripts that will be used by the new site

    top

    Reduce the Number of DOM Elements

    tag: content

    A complex page means more bytes to download and it also means slower DOM access in JavaScript. It makes a difference if you loop through 500 or 5000 DOM elements on the page when you want to add an event handler for example.

    A high number of DOM elements can be a symptom that there's something that should be improved with the markup of the page without necessarily removing content. Are you using nested tables for layout purposes? Are you throwing in more <div>s only to fix layout issues? Maybe there's a better and more semantically correct way to do your markup.

    A great help with layouts are the YUI CSS utilities: grids.css can help you with the overall layout, fonts.css and reset.css can help you strip away the browser's defaults formatting. This is a chance to start fresh and think about your markup, for example use <div>s only when it makes sense semantically, and not because it renders a new line.

    The number of DOM elements is easy to test, just type in Firebug's console:
    document.getElementsByTagName('*').length

    And how many DOM elements are too many? Check other similar pages that have good markup. For example the Yahoo! Home Page is a pretty busy page and still under 700 elements (HTML tags).

    top

    Split Components Across Domains

    tag: content

    Splitting components allows you to maximize parallel downloads. Make sure you're using not more than 2-4 domains because of the DNS lookup penalty. For example, you can host your HTML and dynamic content on www.example.org and split static components between static1.example.org and static2.example.org

    For more information check "Maximizing Parallel Downloads in the Carpool Lane" by Tenni Theurer and Patty Chi.

    top

    Minimize the Number of iframes

    tag: content

    Iframes allow an HTML document to be inserted in the parent document. It's important to understand how iframes work so they can be used effectively.

    <iframe> pros:

    • Helps with slow third-party content like badges and ads
    • Security sandbox
    • Download scripts in parallel

    <iframe> cons:

    • Costly even if blank
    • Blocks page onload
    • Non-semantic

    top

    No 404s

    tag: content

    HTTP requests are expensive so making an HTTP request and getting a useless response (i.e. 404 Not Found) is totally unnecessary and will slow down the user experience without any benefit.

    Some sites have helpful 404s "Did you mean X?", which is great for the user experience but also wastes server resources (like database, etc). Particularly bad is when the link to an external JavaScript is wrong and the result is a 404. First, this download will block parallel downloads. Next the browser may try to parse the 404 response body as if it were JavaScript code, trying to find something usable in it.

    top

    tag: cookie

    HTTP cookies are used for a variety of reasons such as authentication and personalization. Information about cookies is exchanged in the HTTP headers between web servers and browsers. It's important to keep the size of cookies as low as possible to minimize the impact on the user's response time.

    For more information check "When the Cookie Crumbles" by Tenni Theurer and Patty Chi. The take-home of this research:

    • Eliminate unnecessary cookies
    • Keep cookie sizes as low as possible to minimize the impact on the user response time
    • Be mindful of setting cookies at the appropriate domain level so other sub-domains are not affected
    • Set an Expires date appropriately. An earlier Expires date or none removes the cookie sooner, improving the user response time

    top

    tag: cookie

    When the browser makes a request for a static image and sends cookies together with the request, the server doesn't have any use for those cookies. So they only create network traffic for no good reason. You should make sure static components are requested with cookie-free requests. Create a subdomain and host all your static components there.

    If your domain is www.example.org, you can host your static components on static.example.org. However, if you've already set cookies on the top-level domain example.org as opposed to www.example.org, then all the requests to static.example.org will include those cookies. In this case, you can buy a whole new domain, host your static components there, and keep this domain cookie-free. Yahoo! uses yimg.com, YouTube uses ytimg.com, Amazon uses images-amazon.com and so on.

    Another benefit of hosting static components on a cookie-free domain is that some proxies might refuse to cache the components that are requested with cookies. On a related note, if you wonder if you should use example.org or www.example.org for your home page, consider the cookie impact. Omitting www leaves you no choice but to write cookies to *.example.org, so for performance reasons it's best to use the www subdomain and write the cookies to that subdomain.

    top

    Minimize DOM Access

    tag: javascript

    Accessing DOM elements with JavaScript is slow so in order to have a more responsive page, you should:

    • Cache references to accessed elements
    • Update nodes "offline" and then add them to the tree
    • Avoid fixing layout with JavaScript

    For more information check the YUI theatre's "High Performance Ajax Applications" by Julien Lecomte.

    top

    Develop Smart Event Handlers

    tag: javascript

    Sometimes pages feel less responsive because of too many event handlers attached to different elements of the DOM tree which are then executed too often. That's why using event delegation is a good approach. If you have 10 buttons inside a div, attach only one event handler to the div wrapper, instead of one handler for each button. Events bubble up so you'll be able to catch the event and figure out which button it originated from.

    You also don't need to wait for the onload event in order to start doing something with the DOM tree. Often all you need is the element you want to access to be available in the tree. You don't have to wait for all images to be downloaded. DOMContentLoaded is the event you might consider using instead of onload, but until it's available in all browsers, you can use the YUI Event utility, which has an onAvailable method.

    For more information check the YUI theatre's "High Performance Ajax Applications" by Julien Lecomte.

    top

    tag: css

    One of the previous best practices states that CSS should be at the top in order to allow for progressive rendering.

    In IE @import behaves the same as using <link> at the bottom of the page, so it's best not to use it.

    top

    Avoid Filters

    tag: css

    The IE-proprietary AlphaImageLoader filter aims to fix a problem with semi-transparent true color PNGs in IE versions < 7. The problem with this filter is that it blocks rendering and freezes the browser while the image is being downloaded. It also increases memory consumption and is applied per element, not per image, so the problem is multiplied.

    The best approach is to avoid AlphaImageLoader completely and use gracefully degrading PNG8 instead, which are fine in IE. If you absolutely need AlphaImageLoader, use the underscore hack _filter as to not penalize your IE7+ users.

    top

    Optimize Images

    tag: images

    After a designer is done with creating the images for your web page, there are still some things you can try before you FTP those images to your web server.

    • You can check the GIFs and see if they are using a palette size corresponding to the number of colors in the image. Using imagemagick it's easy to check using
      identify -verbose image.gif
      When you see an image useing 4 colors and a 256 color "slots" in the palette, there is room for improvement.
    • Try converting GIFs to PNGs and see if there is a saving. More often than not, there is. Developers often hesitate to use PNGs due to the limited support in browsers, but this is now a thing of the past. The only real problem is alpha-transparency in true color PNGs, but then again, GIFs are not true color and don't support variable transparency either. So anything a GIF can do, a palette PNG (PNG8) can do too (except for animations). This simple imagemagick command results in totally safe-to-use PNGs:
      convert image.gif image.png
      "All we are saying is: Give PiNG a Chance!"
    • Run pngcrush (or any other PNG optimizer tool) on all your PNGs. Example:
      pngcrush image.png -rem alla -reduce -brute result.png
    • Run jpegtran on all your JPEGs. This tool does lossless JPEG operations such as rotation and can also be used to optimize and remove comments and other useless information (such as EXIF information) from your images.
      jpegtran -copy none -optimize -perfect src.jpg dest.jpg

    top

    Optimize CSS Sprites

    tag: images

    • Arranging the images in the sprite horizontally as opposed to vertically usually results in a smaller file size.
    • Combining similar colors in a sprite helps you keep the color count low, ideally under 256 colors so to fit in a PNG8.
    • "Be mobile-friendly" and don't leave big gaps between the images in a sprite. This doesn't affect the file size as much but requires less memory for the user agent to decompress the image into a pixel map. 100x100 image is 10 thousand pixels, where 1000x1000 is 1 million pixels

    top

    Don't Scale Images in HTML

    tag: images

    Don't use a bigger image than you need just because you can set the width and height in HTML. If you need
    <img width="100" height="100" src="mycat.jpg" alt="My Cat" />
    then your image (mycat.jpg) should be 100x100px rather than a scaled down 500x500px image.

    top

    Make favicon.ico Small and Cacheable

    tag: images

    The favicon.ico is an image that stays in the root of your server. It's a necessary evil because even if you don't care about it the browser will still request it, so it's better not to respond with a 404 Not Found. Also since it's on the same server, cookies are sent every time it's requested. This image also interferes with the download sequence, for example in IE when you request extra components in the onload, the favicon will be downloaded before these extra components.

    So to mitigate the drawbacks of having a favicon.ico make sure:

    • It's small, preferably under 1K.
    • Set Expires header with what you feel comfortable (since you cannot rename it if you decide to change it). You can probably safely set the Expires header a few months in the future. You can check the last modified date of your current favicon.ico to make an informed decision.

    Imagemagick can help you create small favicons

    top

    Keep Components under 25K

    tag: mobile

    This restriction is related to the fact that iPhone won't cache components bigger than 25K. Note that this is the uncompressed size. This is where minification is important because gzip alone may not be sufficient.

    For more information check "Performance Research, Part 5: iPhone Cacheability - Making it Stick" by Wayne Shea and Tenni Theurer.

    top

    Pack Components into a Multipart Document

    tag: mobile

    Packing components into a multipart document is like an email with attachments, it helps you fetch several components with one HTTP request (remember: HTTP requests are expensive). When you use this technique, first check if the user agent supports it (iPhone does not).

    top

     

     

     

    原文

    上个月,Yahoo!优异性能(Yahoo!'s Exceptional Performance)开发团队成员 Stoyan Stefanov 出席了蒙特利尔的2008魁北克PHP会议演讲。他提供了他们团队最新的研究成果和提高网页性能规则20条。在早先的高性能网页开发14条军规已经让大家耳熟能详,此次新增的20条更加全面,覆盖了服务器端、cookies、页面内容、JavaScript、CSS、图片、移动手机应用这七大类别。以下内容就是根据这二十条结合个人在实际开发中的理解所做的全面解读。希望对大家开发有所助益。

    阅读指导:

    1. 每条规则后会指明是针对上述所说的七大类别中哪个类别的优化。

    2. 文中提到的一些工具在文后附注中会提供简要说明。

    3. 文中经常提到“组件”这个词,这个词不同于我们程序开发中常提到的组件概念。本文中提到的“组件”特指嵌在HTML页面中图片、JavaScript脚本、CSS等静态文件。

    一、尽早清除缓冲区[服务器端]

        假如用户请求一个页面,而这个页面在后端服务器需要花200至500毫秒乃至更长时间才能生成最终HTML页面,这时候用户浏览器处于较长时间的、等待页面数据返回的空闲状态,用户体验不会很好。此时可以根据页面内容长短做适当分隔,将先生成的页面局部HTML缓冲内容提前发送到客户端,不必让服务器消耗内存缓冲完整个庞大的页面内容后再行输出。这种方法有益于处理后端负荷大而前端负荷轻的页面。

        在HTML页面的head标签位置后是清除缓冲的好位置,因为HTML的head标签可以包括 CSS 和 JavaScript 文件,对于浏览器而言获取页面显示与后端服务器处理并行的效果较好。在PHP中有一个函数 flush(),它可以发送请求页面的局部HTML代码给浏览器,以便浏览器能先取得页面已经生成的部分HTML,同时后端服务器继续忙于处理生成页面余下的HTML。以下以此函数做个示例:


     

    ... <!-- css, js -->

    </head>

    <!-- 注意此处flush()是放在了head标签位置后面 -->

    <?php flush(); ?>

    <body>

    ... <!-- content -->


     

        其他语言也有类似语法,如ASP.NET和ASP中的 Response.Flush()。

        注意:在实际Web开发中,尽量减少HTTP请求次数是优化的重要方面,这条基本原则是早先14条和新增20条中很多规则的制订基础,实际上它也是14条规则中第一条也是非常重要的一条规则,但是使用尽早清除缓冲语句会增加一个页面的HTTP请求次数,这无疑是一个矛盾,因此请注意本条规则的适用范围,不要滥用它。

    二、使用GET方法的AJAX请求[服务器端]

        这个容易理解一些。AJAX经常要用XMLHttpRequest,但是它的POST方法在浏览器中完成需要执行两步:首先发送信息头,然后才是发送数据;而GET方法只用一个TCP数据包传递(cookies信息例外)即可,减少了一个步骤,速度会快些。

        另外根据HTTP规范,GET方法就是为获取信息而生的。因此仅在请求数据而不是发送数据给服务器端存储时,使用GET方法很有意义。

        要注意的是,IE中URL允许最大允许长度是2K,用GET方法发送数据时注意2K的这个限制。

    三、后加载组件[页面内容]

        使用该方法的意义在于:如果某个页面内容丰富多彩的话,在浏览器加载显示它时速度就不会很快。使用后加载组件的方法可以通过延迟加载一些隐藏内容来保证浏览器优先显示初始页面。

        要做到这一点必须仔细观察自己的页面并且问自己:“解释生成一个完整页面,什么部分内容是开始加载时绝对必须显示的?”清楚了这个问题,那么那些余下内容和组件就可以采用后加载方法延迟生成。这样会大大加快页面显示速度。

        这个技巧通常是JavaScript通过处理页面加载时的onload事件完成。例如,使用JavaScript代码和库去执行拖放动态效果操作时,这些操作可以延迟,因为拖动页面上元素的操作只能等初始页面生成完后才能发生。页面中的隐藏内容也适合用后加载方式,因为只有页面加载完毕用户才能操作决定是否显示该内容。

        Yahoo!网站的首页内容繁多,观察处于隐藏状态下的内容,这些内容通常在一些选项卡一样的标签页当中,只有点击后才会加载。

        只要明白该规则的优化要点后相信大家可以通过JavaScript做出自己的具体实现。Yahoo!提供了两个用于实现后加载方法的工具:

    ◆ YUI Image Loader:可以延迟图片显示

    ◆ YUI Get utility:它可以在页面加载完成后把JavaScript和CSS资源绑定到DOM上去。

        以上的工具是Yahoo!的YUI库提供。

    四、预加载组件[页面内容]

        从文字上看预加载组件与后加载组件似乎作用相反,但实际上二者目标是完全不同的。通过预先加载组件可以充分利用浏览器的空闲时间,并且可以请求未来页面需要的组件。在这种情况下,当用户访问下一个页面时,你已经提前让大多数组件保存在缓存中,用户加载这个页面就会非常快。

        预加载类型有下列三种:


     

    1. 无条件预加载

        onload事件一触发,就要马上取回一些指定的组件。可以检查google.com首页中onload事件中请求Sprite图片的例子(注:什么是Sprite图片,请参看第十六条规则)。在这个例子可以看出这个sprite图片www.google.com/images/nav_logo3.png在google.com首页本身并不需要, 但它会在随后用户搜索生成的结果页面中需要。


     



    2. 条件预加载

        根据用户操作预测用户下一步操作的方向,并据此做预加载。例如,search.yahoo.com中,在输入框中刚键入几个字符后,就会看到页面对你键入的词做出合理推测,推出几个可能要搜索的实际关键词。此方法目前谷歌(google.cn)也在使用。

     

    3. 提前预加载

        在将重新设计的网站页面发布前用此法较好。页面重新设计后常会有这样的反馈:“新站点太酷了,就是比以前慢”。原因在于用户访问旧站点是全缓存的,但新站点还没有缓存过。这时可以在发布新设计前就预加载一些新站点组件,这可以减少没有缓存的副作用。可以利用用户访问旧站点时浏览器空闲的时间请求新站点要使用的图片、脚本等。

    五、减少 DOM 元素数量[页面内容]

        一个复杂的页面意味着要请求下载的字节数更多,也意味着用JavaScript访问DOM速度更慢。

        如何尽量减少已有页面的 DOM 元素数量呢?一个重要的思路就是不要滥用表格table和div 。很多人习惯用一些网页编辑软件去设计页面,这样会导致大量嵌套的表格或在使用语义不合法的标记。使用div要仅当它在语义上有意义时才使用它,有些开发者使用它仅仅是因为它可以被浏览器解释生成一个新行。

        Yahoo! 提供了一个避免这些问题的方法——使用YUI CSS工具。grids.css 有助于整体布局设计,fonts.css 和 reset.css 有且于清除浏览器的默认格式设置。这些工具可以在Yahoo!的YUI页面中去找。

        DOM元素的数量可在Firebug的Console上键入 document.getElementsByTagName('*').length 得到。

        DOM 元素不超过多少才适当呢?这可以通过检查一些有良好设计的页面来感觉比较。如Yahoo! 主页访问量相当大,它的数量在700个元素(HTML标签)以下。

    六、分隔组件到多个域中[页面内容]

        对终端用户响应时间影响最大的就是所请求页面所含组件数量。只要浏览器缓存为空,下载每个组件需要占用额外的HTTP请求,只有缓存满时才可能不占用。

        HTTP/1.1规范中建议浏览器对每一个主机名允许并发下载两个组件。默认状态下,Internet Explorer和Firefox都符合这个规范。注意:IE8.0默认允许6个并发请求。

        许多网页中所有组件都从同一主机名中下载,这时不仅响应时间受并发线程数限制,同时也受该服务器CPU和带宽限制。把页面组件分布在两个主机名中,整体响应时间就会快2倍,CPU和带宽消耗也会得以分担。

    七、尽量减少 HTML 标签 iframe 的使用数[页面内容]

        iframe允许在父文档内插入一个HTML文档。要想高效使用iframes,理解它的工作方式很重要。

        使用iframe有如下好处:

    ◆ 有助于减慢显示第三方标记和广告内容。

    ◆ 是个安全的 Sandbox。

    ◆ 能并发下载脚本。

    但同时也有弊端:

    ◆ 即使iframe 内的 HTML 文档内容为空,消耗也比较高。

    ◆ 会阻止页面的onload事件

    ◆ 非语义的

    八、避免404页面[页面内容]

        如果做了一个HTTP请求然后得到一个无用的响应页面,不仅完全不必要而且会降低用户体验。404页面就是在没有发现指定资源时返回的页面。

        一些站点提供了有益的404提示,对用户体验有好处,但这毕竟浪费了服务器资源。当链接一个外部JavaScript文件,而它又出了404错误,这尤其糟糕。首先,因为这个下载有问题会阻止并发下载;其次,即使有错浏览器仍然会尽力解析404返回的内容,看看有无JavaScript代码,尽力查找里面可用代码。

    Posted Dec 25 2008, 11:01 PM by Coolboy with no comments
    Filed under: ,
  • 很多抽筋的笑话,心情不好的孩子慢慢看。我看完了,笑的肚子疼!

    1.有一天小明手上打着石膏,
      老师问:你的手怎么了
      小明说:断掉了
      老师说:为什么?
      小明说:因为我太懒了
      老师说:太懒手会断?
      小明说:我走在路上,鞋子跑进一颗石头,
      可是我懒的用手弄,
      就抱着电线杆抖着脚让石头掉出来,
      路人看了以为我触电就用木棍打我的手
      所以.................
      老师:............


    2.在大陆做生意的台商,
      由于家眷都在台湾,
      所以每个晚上都喜欢跑声色场所。
      有一天他不幸被公安逮到,
      台胞证被盖了个“淫虫”两个大字。
      他很不高兴,
      于是透过关系花了一些钱,
      要把这着不雅的名词去除。
      
      过了一星期,
      朋友告诉他办好了。
      他想,在大陆只要有钱哪有办不到的事?
      他接到台胞证后兴冲冲打开一看,
      里面赫然盖了个三个大字:
      非淫虫。

    后来他透过更有力的人士想要把这
      非淫虫
      三个字弄掉,
      因为他觉得这三个字还是不雅,
      所以这次交代一定要把这件事解决。
      因为下个月他就要回台湾了....
      朋友也跟他再三保证,
      一定没问题,
      只是礼数绝不可少。
      
      又过了一星期,
      朋友来找他,对他说:这次真的办好了!
      他赶紧把台胞证接过来一看,
      上面写着:
      非洲淫火虫

    3.甲乙丙三人一起出游,甲感冒了……
      晚上,大家同睡一床,甲睡中间。
      
      半夜…甲打了一个大喷涕,
      乙丙整个脸上都是甲的结晶。
      乙丙:下次要通知我们……
      
      过了半个时辰,
      甲:注意了…
      乙丙闻言赶紧钻入棉被中,
      并确定与外界没有连通…
      结果,甲放了个屁。


    4. 我有一次和几个同学
      去高中老师家看他,
      那是一个老头,临走,
      我们留下一些水果送给老师,
      可是老师紧紧拉住班长的笔记本电脑包说:
      “看看,来看我还带什么东西呀……
      放在门口就好了.”


    5.陪朋友打的去见一个网友,
      快到的时候,
      朋友指着不远处一个奇丑无比的女孩对司机说:
      “看到那个女的了吗?”
        
      “看到了,在那儿停?”
      “不,撞死她!!!”


    6.一天在东方广场约网友MM见面,
      不想显的太土,约在星巴克。
      等MM时觉得不买点东西不合适,
      
      就到柜台点咖啡。
      服务员问:“您要点什么?”。
      当天没带眼镜,
      咖啡厅灯光昏暗,
      我使劲看价牌,还是看不见……
      就说了一句:“看不清楚!”。
      
      服务员:“好的,卡布奇诺!”
      于是我就喝到了在星巴克的第一杯Cappuccino……


    7.某公司经理叫秘书转呈公文给老板:
      “报告老板,下个月欧洲有一批订单,
      我觉得公司需要带人去和他们开会。”
      老板在公文后面短短签下:“ Go a head”。
      经理收到之后,马上指示下属买机,
      拟行程,自己则是整理行李。
      临出发那天,被秘书挡下来。
      秘书:“你要干什么?”
      经理:“去欧洲开会啊!”
      秘书:“老板有同意吗?”
      经理:“老板不是对我说Go a head吗?”
      秘书:“来公司那么久,
      难道你还不知道老板的英文程度吗?
      老板的意思是:去个头!”


    8.某兄喜欢吃鱼。
      沃尔玛的鲈鱼9块一斤,
      要是死了放冰上的就7块两条,
      一样新鲜。某兄下班,
      就赶紧跑去买,还是经常被人买走了,
      某兄就站鱼缸前等啊,
      有时候好半天都不死一条。
      某兄就用网进去捞,用把手敲鱼的头。
      服务员实在看不下去了,
      过来跟该兄说:
      “先生,昏过去的不算……”


    9.偶MM班任是个50多岁的老女人。
      一日到男生宿舍探访,
      正好一男生什么也没穿在地下乱窜~
      被班任看到了
      立刻大叫一声跳到床上,
      盖住被子~
      班任留下一句话就走了:
      我这么大岁数了什么没见过,
      你叫什么叫~
      该同学巨寒- -!!!


    10.盗版光碟:

    -Are you serious?(你是认真的吗?)
    -No,I'm kidding.(不,我开玩笑的.)
        
       电影上的翻译:
        -你是席拉瑞丝吗?
        -不,我是凯丁..

    11.大一的时候,
      偶寝室一哥们
      一天早上起来
      发现枕头上有半只大黑蛾子,
      感觉倍儿郁闷。
      
      提起来正要扔,
      赫然发现蛾子翅膀上的齿印。。。。。。
        
      
      全寝室暴寒一学期!!!


    12.一对男女偷情,丈夫突然回家,男的没顾穿衣服就跳窗逃跑,走在大街上路上围观,男的装着若无其事看天:啊,这就是地球呀。路人说:cao,装鸡毛外星人。


    13.我们寝室对面有一小面馆。
      寝室一室友,
      特爱耍酷,
      某日正待在窗边洗头,
      待洗完,
      头发一甩作明星状,
      手指向面馆,
      大喊一声:对面吃小面的朋友们,你们好吗!


    14.一日同学去中关村转悠,
      一小贩凑过去问,
      “要硬盘不?便宜”
      
      同学拿过来看看 说:“有多硬”

    15.以前大学的时候,
      晚上睡觉前大家都要闲扯一会.
      
      一次说道如果晚上有歹徒翻进寝室怎么办?
      (当时正报道有个女生寝室被人强奸了)
      一姐妹说:看见他翻上阳台,大家一起上!
      “然后呢?”众人问,
      
      
      她顿口气接着说:
      “拖进来轮奸他,
      搞到他精尽人亡,
      让他以后路过我们这栋楼,都得绕道走!”


    16.大学的宿舍里有个哥们爱说梦话,
        
      有天晚上我正起来喝口水,
      谁知他突然大吼了一声:“喂!”
       吓得我把杯子打烂了……
      
      
      某天晚上,又继续说梦话,
      喃喃地说:
      “其实……其实……我……怀孕了……(略带哭腔)”


    17.有一次夏天在外面吃宵夜,
      旁边桌子上坐了一个光膀子的胖子。
      巨胖,上身的肉都是吊起的。
      吃了一半,
      传呼机响了(9几年的时候)我们一看都不是我们的。
      
      结果看到那个胖子把腰上面的肉翻起来,
      看了下传呼算后又把肉放下来,接到起吃。
      当时我们一桌的美女就喷饭了。


    18.百度知道

    急求论文:浅析中国艺术的意境美
    悬赏分:0 - 解决时间:2007-6-22 18:24
    急求论文:浅析中国艺术的意境美
    2500字~3000字
    大家有的帮帮忙,先谢谢列!

    浅析中国艺术的意境美
    悬赏分:0 - 解决时间:2007-6-24 14:12
    湖师文理的同学们 我是教你们美术概论的曹老师!关于本次浅析中国艺术的意境美的论文 为了防止你们抄袭!我已经把百度搜索到的关于浅析中国艺术的意境美的前40页的所有网页全浏览过!目前还在继续浏览其他的!请你们注意了!要自己动脑!!

    19.一个同学,他的电脑每天早上会自动开机(估计是因为宿舍里早上来电的时候一瞬间冲开的)。

    结果他老人家拿了一个符贴在了电脑上。。。

    20.某日,A君在厕所里面拉屎,
      估计拉不出来,
      就在厕所里面狂吠。
      
      此时,外面的B君听到,
      于是高声唱到:
      “拉不出来一声吼啊!”
      更绝的是,
      C君马上接着唱到:
      “再拉不出来就用手抠啊!”
        
      
      此后,此歌成为我们寝室的室歌

    21.照科目三考试,早晨5点就让集合,自然考的时候迷迷糊糊。
    轮到我上车,起步,走,稳妥的开,考官不说话,坐在旁边。
    突然,考官对我说,加油,同学。
    顿时,我受宠若惊,心里一股暖流,心想,多好的考官啊,知道我紧张,还鼓励我。
    于是,我微笑着对考官说,谢谢考官。
    考官一愣,显得有点无奈。就这么开,转弯过了,考官又来了一句,加油!
    我又温暖了一把,感动了一把,还是微笑着说,谢谢考官!
    考官好像更无语了,强忍着面部表情,摇了摇头。
    快到终点了,考官第3遍不耐烦的说,加油!加油!同学。
    还没等我谢字说出口,考官挺着身子指着我踩油门的右脚说:
    我是让你踩油门的脚加油,不是给你加油!你以为这是奥运会,我来看你比赛的啊!


    22.夜,四人寝室一人睡着了,
      还有三人在讨论追女孩子第1次怎么表白,
      讨论得正热闹,
      那个睡着的醒了:
      啥也别说了,咱们睡觉吧.....


    23.北大的研究生和本科生校区是分开的,
      研究生在一个名叫万柳的校区。
      
      在本科生校区,
      也就是北大本部小西门那个地方有一个自行车停车场,
      专门为研究生准备的,
      墙上写着“万柳同学停车处”。
      
      有一次和一朋友从那过,
      见他欲言又止,
      最后挣扎了半天终于疑惑地问我:
      你说这万柳同学是谁呀,真牛X,这么多自行车!”


    24.刚开学,
      来了个新的英语老师,
      
      他要求以后我们回答问题必需都英语回答.
      
      然后他开始点名:NO.1.
      他喊.
      我们班1号就站了起来,
      喊了声:到!那个老师说:
      Please in English!(请用英语回答)
      我那同学挠了挠头,
      憋了半天答了句:
      导~~~(发第二音)
        
    25.我们宿舍哥们暴强,
      一日他发现蚊帐里有只蚊子,
      忙活抓了半天没抓到,
      哥们叹了一口气说:
      “妈的,饿死你!”
      然后迅速把蚊帐收了起来,
      忍了好几天没挂蚊帐,
      最后终于把蚊子给饿死了,
      我们那个汗呀~~~~~
        
      
      还是蚊帐的事:
      一日他又发现蚊帐里竟然飞进一只苍蝇,
      跟我们说:“我非弄死他”,
      我们说:“苍蝇可是耐饿呀,看来你是靠不过他的”。
      “你们看吧”,
      这人抄起一本小说钻进蚊帐,
      封口。
      边看小说边不停的挥动扇子,
      就是不让苍蝇落地,
      结果两个小时后,
      苍蝇终于飞不动了。
      
      他凑过去捅了捅苍蝇说:
      “飞呀小样,爷书还没看够呢”


    26.一考入北京某大学的学生与校友的对话:
        你是云南的?
        "YES"
        "哇..好远啊...."
        ..........
         "云南解放没有?"
        "没有,我们上课的时候都带着枪"
         "你原来会说汉语~!"
        "来的时候在火车上刚学的" .
       “你们住窑洞吗?”
        “不,我们住树上”
        “云南是不是在昆明?”
         "恩,云南是昆明的省会。"
        "你的很多小辫子呢?"
        "为了上大学只好剪掉了!"
        “你们还吃生肉吗?”
        “我们老大发明了燧木取火,我们吃烧烤,”


    "你是云南人啊?"
        "是啊。"
        "那太好了,下次我去拉萨旅游,就住你家了啊。"
        "……没问题,不过我家离拉萨稍有点远。"
        "那你们怎么来上学?"
        "骑驴到北京后坐飞机。"
        "那一定很久才到吧?
        "习惯了,提前半年出发就行!"
        "………………!
        怎么不骑马呢?
        "在云南,骑马的都是穷人干的事情,像我们考出来的,
        都是骑骆驼和驴的。
       然后云南没有高考,考试都是比赛射箭,
        一公里以外摆个牌子,
       写上"清华"旁边放一个"北大"然后一个人有三次机会,
        我第一次射清华,第二射北大,都失败了,最后为了保险,
        射了最近的一块牌子,就是这个学校.


    27.我大学时,
      宿舍的厕所堵了,
      一哥们自告奋勇,
      说他去通之,
      用一跟两米长的棍子在厕所洞里用力捅,
      三下之后果然通了,
      还冲了几次水,
      效果很好,
      
      
      我刚要夸他就发现那个洞里的居然有很强的光,
      仔细一看原来下水道被捅穿了,
      楼下还有人在大号,
      我们在楼下那位冲上来之前都闪了。。。。


    28.我中专的室友,
      有一次放假前一块喝酒,
      后来喝多了,
      上到3楼楼梯口看到走廊上有水,
      
      突然摆脱扶他的两个兄弟,
      说了一句:
      “我要游到我们宿舍去”
      
      然后就一个前扑动作,
      扑到走廊上做起蛙泳的动作,
      周围人倒!!!
      这样游了四五米后,终于被人拉了起来


    29.我们宿舍
      晚上有去通宵要么就是出去和老婆打野战的,
      很晚回来,
      喊我们开门,
      然后我们就让他们对口号,
      
      天王盖地虎,
      宝塔镇河妖,
      么哈么哈,
      脸怎么黄了?
      他们要是不说是吃屎吃黄的绝对不开门。
      
      有一次冬天晚上下鱼,
      风又挺大,
      
      一哥们冻的不行了,
      回来就敲门,
      也不对暗号了,
      直接就在那喊,
      我脸是吃屎吃黄的,
      赶紧开门吧。
      
      声音之洪亮,我们住1楼,3楼的都听见了。。。。


    30.我上铺痛经很严重,
      每次到周期都要卧床休息。
      
      我们这些室友就坐在她床边一边照顾她一边聊天。
      一次她痛得受不了,
      说要做手术把子宫切除了,
      反正她也不想要孩子。
      
      我们就在罗列子宫切除后的好处。
      除了再也不用痛经,
      A说还可以节省卫生巾的钱,
      B说可以节省买套套的钱,
      C说更不用花大钱做人流了……
      轮到最后一个,
      她想了半天,
      说,
      
      
      
      
      切下来的子宫我们可以炒着吃,应该挺补的……

    31.从左岸到中关大道上有很多卖毛片的人
      见你走过去
      就问
      哥们 要片儿吗?
      我们起初很反感后来习惯了
      
      有一个寝室一哥们
      和女友去中关村配电脑
      回来特别郁闷
      说被卖片儿的骚扰
      大家说没什么
      
      
      
      这哥们说:
      问题是那SB
      过来问我"哥们 毛片儿拍吗?"


    32.还有一个,是听别人说的。
      话说月底最穷的时候,
      一寝室人都没钱了,
      又不敢问家里要,集体节食。
      为了节约体能,大家都翘课了。
      
      中午辅导员来寝室,
      见一个个都有气无力地在床上躺着,
      很是诧异。
      还没开口,就听寝室老大慢悠悠地说了声“午饭时间到”,
      大家晃晃悠悠地从床上下来,到水房喝一通自来水,回来继续睡……


    33.大学有一个女同学,
      北京人,
      冷幽默的那种。
      她说起她高考后查分的事情。
        
      
      打电话到查分台查分。
      查到数学分数的时候,
      电话里报:
      “您的数学分数是6——”
      听到这,
      她心里一阵窃喜:
      “嘿,数学让我蒙到60多分了?”
      “——分!”电话里面接着报。


    34.大一,石家庄,
      冬天,一日天寒地冻,
      正好是上午下课吃饭时间,
      路上全是朝食堂走的人群,
      我们班几个走到图书馆前,
      这里有口大水塘,结了薄薄一层冰,
      
      我们几个南方的就讨论
      这冰面能不能承受一个人的重量,
      这时来自陕西的老大现身说法地跳上了冰面,
      说:没问题,看还能走人呢,
      不仅能走还能大跳呢。
      
      言毕,
      只见老大以慢动作从冰面慢慢沉入池底,
      手还保持着向我们挥动的姿势,
      全校大部分同学均目瞪口呆地了这个精彩的瞬间。
        
      老大反应身手了得,
      几个扑腾到了岸边,
      然后迅雷不及掩耳爬起来就跑,
      等我们回到寝室只见其拥被于床说:
      不用说了,以后谁再提,我灭谁。


    35.一次逛街时突然觉得肚子很痛
          于是走进街角的199吃到饱的火锅店
          想说借个厕所用用
          偏偏找遍了一楼就是找不到
          于是我跑到二楼去
          二楼是还在装修空荡荡的没有任何东西
          但是却发现有一间厕所贴著“故障待修,请勿使用“
          我实在是忍不住了
          管他三七二十一,反正四下无人
          脱了裤子就朝马桶蹲下去
          霹雳啪啦……好爽! !
          
          结束后
          我走下楼去却发现空无一人
          奇怪了,正值晚餐时间 刚才楼下还高朋满座
          怎么一下子就人去楼空呢?连服务生和接待都不见了……
           於是我走近吧台,
          并且问到:有人在吗?怎么都没人了?
          此时,只见一个男服务生从吧台下钻出来,
          并且开口说:
          我操!……刚才大便从天花板掉下来
       打到电风扇的时候你不在吗?算你运气好......


    36.熄灯后,
      男生宿舍集体高呼“来电!来电!”,
      结果5分钟后真的来电;
      接着,
      男生宿舍集体高喊
      “晚点熄灯!晚点熄灯!”
      然后真的11:50才熄灯;
      最后,
      男生宿舍集体高叫“女人!女人!……”


    37.高中时讲排列组合,分组做题。
      老师叫起磊:“你们组多少人?”
      磊:“十二个。”
        
        
      老师:
      “好,那你算一下,
      十二个人排队,
      你不能站在排头和排尾,
      则有多少种排法?”
        
        
      磊埋头算:
      “啊,有十二个人,
      我不能在排头…是…不能在排尾……”
        
      一会儿,
      终于糊涂,做错。
      老师怒,罚磊站。
        
        
      又叫起波:“你们组多少人?”。
      波惧,
      半晌,
      答:“三个……”


    38.前两天,
      公司的山东客户老张打来电话,
      向我询问一些工作上的问题。
      
      我们在电话里聊了好半天,
      最后为了便于网上交流,
      我让他留下电子邮箱地址。
      
       老张说:
      “你记一下,
      我的地址是……
      老张的汉语拼音全拼……
      然后是……
      后头没有.com.”
      
      “后头没有.com?”
      我一边记录一边琢磨着,
      邮箱后缀中没有.cn是正常的,
      但是如果没有.com,那还是邮箱吗?
      
       于是,我忙问他:“@后边是什么啊?
      也就是说,
      你邮箱是在哪个网站上建立的?”
      
      老张说:“不是告诉你后头没有.com了吗?! ”
      见我还不明白,
      老张有点不耐烦了
      ,说:“干脆我把地址发到你手机上好了,省得你听不懂。”
       挂了电话,几分钟后,
      我的手机响了。
      我打开一看,
      顿时恍然大悟。
      
      
      
      原来,他的邮箱是laozhang@hotmail.com


    39.A:I'm sorry!
    B:I'm sorry,too.
    A:I'm sorry three.
    B:What are you sorry for?
    A:I'm sorry five.


    40.拨通800-820-3800

    用户:你好,请问这里是微软吗?
    微软:是的,请问您有什么事吗?
    用户:前几天看到你们发布公告,不是说好了要黑屏的吗?我都等一天了,怎么还不黑啊。。。。
    微软:#%$^&@
    用户:你们到底黑不黑了?
    微软:…….
    用户:说啊,你们黑不黑?


    微软:黑… 盗版的才黑,你是盗版吗?
    用户:是啊,100%盗版,绝对盗版.
    微软:那不应该啊,对了,你打开自动更新了吗?
    用户:打开了啊,早早的就打开了,就等着看黑屏呢!
    微软;##$%^&%$#@$%…
    用户:怎么了?不需要打开啊?
    微软:需要,需要!
    用户:那咋还不黑呢?
    微软:你的自动更新有提示你下载补丁吗?
    用户:这倒没有,我等老半天了,最后等不了了,自己去你们网站上下了一个,结果还是不黑,你说这玩意整的!
    微软:….
    微软:对不起,先生,我们暂时无法解决你的问题,呆会找技术人员跟你联系,谢谢!

    挂机…………

     

    41.小平和毛主席散步。
      
      小平:租西,四介桑最同库地是洒子四琴喽?
      主席:桑班!
      小平:莫友比择更库地了?!
      主席深吸了一口烟,凝视前方:田田桑班.....
      小平继续问:“有崽同库地吗”
      主席二目一瞪,把烟袋一摔:“甲板!”
      小平又问:“那崽崽同库滴哩?”
      主席急了,说:“白甲板!”


    42.——昨天坐公车的时候,
      公车司机一直盯着我看,
      就象我没买票似的。
            
      ——那你怎么办?
            
      ——很简单,
      我也一直盯着他看,
      就象我买了票似的


    43.夏天的某次下课,
      我趴在课桌上闭着眼睛迷糊,
      迷糊中感觉有人的手臂碰到我的手指了,
      我以为是同桌,
      
      就用指甲抠了他一下,
      发现没反应,
      我又加重力量抠了他一下,
      还是没动,郁闷了,
      这不符合我的同桌的作风呀,
      难道抠轻了?
      
      所以我就一顿猛折腾,
      又是抓,又是扭的,
      折腾了一会,自己都感觉不对劲了,
      稍稍睁开眼,呀,
      发现是老师坐在我同桌的位置,
      正不可思议看着我,
      那手上那块皮肤都红了


    44.我们撮合公司里一对儿暧昧的男女,
      
      但女的喜欢男的,
      男的不喜欢女的,
      一次,
      四个人坐到一起,
      
      我说:
      你小子对我们毫米有感觉就别装了,
      赶紧表白,
      
      谁想,
      这家伙懒洋洋的坐在椅子上,
      用手摸了一下自己裤裆:
      有个P感觉啊,
      你们看,连硬都不硬,平平的。
      
      
      那女孩赶紧关切的说:
      是么,我摸摸…

    45.英国《每日电讯报》4日报道,
      一南威尔士人看到一个“明亮、静止”的不明飞行物,
      于是拨打“999”向警方紧急报告自己的发现。
      英国警方4日公布了这段通话记录,
      内容如下:
          
      警:“这里是南威尔士警察,你遇到什么紧急事件?”
      民:“其实也不怎么紧急。我只是需要告诉你们,
      山那头有一个明亮、静止的物体。”
      警:“好。”
          
      民:“如果你们有几分钟空闲,也许你们能来看看它是什么?
      它在那停留至少半小时,而且现在还在那里。”
      警:“它在那停留半小时。好。它是在山上还是在天上?”
      民:“它在天上。”
      警:“我会派人到那查清楚。”
      民:“OK。”
          
      通话记录包括警员赶赴现场后与总部的通话内容。
          
        
      总部:“(代号)阿尔法—祖鲁20,
      天上那个物体,有人查看它没有?”
      在场警员:
      “是的。
      它是月亮。
      完毕。”

    46.800壮士为什么只剩下300人了?
      
      
      
      
      
      
      
      
      
      
      
      
      因为伍佰去唱歌了
      
      
      
      
      于是这300壮士又吸纳了100人
      于是他们变成了什么?
      
      
      
      
      
      
      
      
      
      
      
      蜘蛛侠(四百的MAN)


    47.一天下午,我同学在建设银行十分无聊的上班,一个穿得很糟糕的女士(神经病患者)来到他窗口,给了他一张纸条要提款。
      纸条上赫然写着
      
      "兹派XX同志