<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Websiteudvikler &#187; Performance</title>
	<atom:link href="http://websiteudvikler.dk/post/tag/performance/feed" rel="self" type="application/rss+xml" />
	<link>http://websiteudvikler.dk</link>
	<description>website development, CMS, e-commerce, data integration and web analytics</description>
	<lastBuildDate>Thu, 02 Feb 2012 22:21:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Hurtigere billedskalering til Dynamicweb eCommerce</title>
		<link>http://websiteudvikler.dk/post/hurtigere-billedskalering-til-dynamicweb-ecommerce.html</link>
		<comments>http://websiteudvikler.dk/post/hurtigere-billedskalering-til-dynamicweb-ecommerce.html#comments</comments>
		<pubDate>Sat, 05 Mar 2011 12:54:03 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Webudvikling]]></category>
		<category><![CDATA[Dynamicweb]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Webshop]]></category>

		<guid isPermaLink="false">http://websiteudvikler.dk/?p=585</guid>
		<description><![CDATA[En efterhånden solid web app - skal den gå direkte til Dynamicweb eller ud i Open Source land?
Hvad synes du?]]></description>
			<content:encoded><![CDATA[<p>Jeg har for flere år tilbage lavet en webapp som kan skalere JPEG billeder og den er blevet implementeret på en håndfuld sites efterhånden, og er blevet opdateret, forbedret og ret solid, hvis jeg selv skal sige det.</p>
<p>Du kan se nogle eksempler på hastigheden af den på:</p>
<p><a href="http://metoo.spiritwholesale.com/Pige-336.aspx?GroupID=MINIGIRLOVERDELE">http://metoo.spiritwholesale.com/Pige-336.aspx?GroupID=MINIGIRLOVERDELE</a><a href="http://www.hvidtogfrit.dk/SHOPMENU/KØB_HVIDEVARER/Produktliste.aspx?GroupID=GROUP1" target="_blank"></p>
<p>http://www.hvidtogfrit.dk/SHOPMENU/KØB_HVIDEVARER/Produktliste.aspx?GroupID=GROUP1</p>
<p></a><a href="http://www.kop-kande.dk/Shoppen.aspx?ID=1949&amp;GroupID=GROUP20047">http://www.kop-kande.dk/Shoppen.aspx?ID=1949&amp;GroupID=GROUP20047</a></p>
<p>Lige fra start har jeg haft indbygget i den, at den ikke skalere billedet hver gang billede kaldes, men at den skalere original billedet første gang, og så gemmer det skalerede billede til originalen overskrives. Det er lynhurtigt og vildt meget performance besparende, når der skal vises mange billeder.</p>
<p>Nu er tiden kommet til, at jeg gerne vil høre din mening om flg.:</p>
<ol>
<li>Skal jeg sende kilden til Dynamicweb og høre om de ikke vil lave deres billedskalering på samme måde?</li>
<li>Skal jeg udgive kilden som Open Source, så kun nørder der kender til mit projekt kan bruge den?</li>
</ol>
<p>Man kan sige, at ved mulighed 2, kan Dynamicweb jo stadigvæk implementere den alt afhængig af Open Source licensen.</p>
<p>Glæder mig til at høre dit synspunkt og iøvrigt om du kunne bruge billedskalerings app&#8217;en.</p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/hurtigere-billedskalering-til-dynamicweb-ecommerce.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Kan Google Reader være med til at øge hastighed på at indeksere min blog ca. 20 minutter?</title>
		<link>http://websiteudvikler.dk/post/kan-google-reader-vaere-med-til-at-oege-hastighed-paa-at-indeksere-min-blog-ca-20-minutter.html</link>
		<comments>http://websiteudvikler.dk/post/kan-google-reader-vaere-med-til-at-oege-hastighed-paa-at-indeksere-min-blog-ca-20-minutter.html#comments</comments>
		<pubDate>Tue, 12 Jan 2010 19:16:08 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Analyse]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Indeksering]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://blogs.co3.dk/kevinsteffer/post/kan-google-reader-vre-med-til-at-ge-hastighed-p-at-indeksere-min-blog-ca-20-minutter/</guid>
		<description><![CDATA[Jeg har lige oprettet en blogpost kl 20:21 “Google AdWords information til at blive klogere på”. Kl. 20:24 havde Google opdateret min forside Kl. 20:47 havde Google fundet min nye blogpost Det er ikke ligefrem Google fra den lade side&#8230; Google Reader Jeg har en mistanke om, at Google måske bruger oplysningerne fra deres egen [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg har lige oprettet en blogpost kl 20:21 “<a href="http://blogs.co3.dk/kevinsteffer/post/google-adwords-information-til-at-blive-klogere-paa/">Google AdWords information til at blive klogere på</a>”. </p>
<p>Kl. 20:24 havde <a href="http://www.google.com" target="_blank">Google</a> opdateret min forside</p>
<p><a href="http://websiteudvikler.dk/wp-content/uploads/2010/01/google_updates_frontpage.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="google_updates_frontpage" border="0" alt="google_updates_frontpage" src="http://websiteudvikler.dk/wp-content/uploads/2010/01/google_updates_frontpage_thumb.png" width="562" height="76" /></a> </p>
<p>Kl. 20:47 havde Google fundet min nye blogpost</p>
<p><a href="http://websiteudvikler.dk/wp-content/uploads/2010/01/google_found_my_blogpost.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="google_found_my_blogpost" border="0" alt="google_found_my_blogpost" src="http://websiteudvikler.dk/wp-content/uploads/2010/01/google_found_my_blogpost_thumb.png" width="554" height="92" /></a></p>
<p>Det er ikke ligefrem Google fra den lade side&#8230;</p>
<h2>Google Reader</h2>
<p>Jeg har en mistanke om, at Google måske bruger oplysningerne fra deres egen Google Reader. </p>
<p>Jeg abonnere jo på min egen blog for at kontrollere, at mine blogpost ser rigtige ud i RSS readers. Jeg bruger Google Reader, som er en online RSS reader, hvor jeg kan samle alle mine RSS feeds.</p>
<p>Det undrer mig helt vildt at Google kan indeksere min blogpost på under 20 minutter, og det er ikke første gang jeg opdager det. Jeg opdagede det første gang på min blogpost <a href="http://blogs.co3.dk/kevinsteffer/post/linq-dataset-recordset-performance-resultat/">Linq, Dataset, Recordset performance resultat</a>, der tog det ca. 15 minutter. </p>
<p>Min traffik på min blog synes jeg ikke er tankevækkende høj til, at Google bør komme forbi så hurtigt og opdage mine nye blogpost. Og jeg synes, at det ville virke ganske gennemtænkt, da Google Readeren jo henter mine nye indlæg på baggrund af mit RSS tilmelding, så kunne den jo lige sende Googlebot ud på sitet, når den nu ved, at der er et nyt indlæg at indeksere.</p>
<p>Kender du til tegn på lignende eller det helt modsatte, så vil jeg gerne høre fra dig, imens hopper jeg lige i logfilerne for min blog og undersøger, hvor tit Googlebot kommer forbi, eller den bare kigger forbi lige efter, jeg har oprettet en blogpost.</p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/kan-google-reader-vaere-med-til-at-oege-hastighed-paa-at-indeksere-min-blog-ca-20-minutter.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Linq, Dataset, Recordset performance resultat</title>
		<link>http://websiteudvikler.dk/post/linq-dataset-recordset-performance-resultat.html</link>
		<comments>http://websiteudvikler.dk/post/linq-dataset-recordset-performance-resultat.html#comments</comments>
		<pubDate>Sat, 26 Dec 2009 20:42:31 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Analyse]]></category>
		<category><![CDATA[Dataset]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Microsoft .NET]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Recordset]]></category>

		<guid isPermaLink="false">http://blogs.co3.dk/kevinsteffer/post/linq-dataset-recordset-performance-resultat/</guid>
		<description><![CDATA[Jeg har i længere tid undret mig over en dårlig performance med anvendelse af LINQ, og nu er jeg gået på jagt efter synderen i tiden i databasen SQL Server. I denne første test jeg har lavet har jeg dog ikke fundet synderen, men stadig et interessant resultat, som bekræfter mig i, at du ikke [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg har i længere tid undret mig over en dårlig performance med anvendelse af <a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank">LINQ</a>, og nu er jeg gået på jagt efter synderen i tiden i databasen <a href="http://www.microsoft.com/SQL/default.mspx" target="_blank">SQL Server</a>.</p>
<p>I denne første test jeg har lavet har jeg dog ikke fundet synderen, men stadig et interessant resultat, som bekræfter mig i, at du ikke skal bruge et <a href="http://msdn.microsoft.com/en-us/library/system.data.dataset(VS.71).aspx" target="_blank">Dataset</a> som bliver indlæst med data fra en <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx" target="_blank">SqlDataAdapter</a> med Fill metoden, og her kan du se hvorfor:</p>
<p><img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=1&amp;v=1261860309379" width="300" />&#160; <img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=2&amp;v=1261860545958" width="300" /> </p>
<p><img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=3&amp;v=1261860593529" width="300" />&#160; <img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=4&amp;v=1261860624910" width="300" /></p>
<p>Min test går i sin simpelhed ud på at læse 1.000, 10.000 og 100.000 rækker fra en simpel tabel og så måle, hvor lang tid det tager få de tre måder at hente data ud på fra en SQL Server.</p>
<h2>Konklusion</h2>
<p><strong>Recordset dobbelt så hurtigt til små database kørsler</strong></p>
<p>Ved små data mængder er LINQ ikke så hurtig som Recordset, men da tiden er så lav mærkes det ikke, hvis de er enkelte jobs, så det er reelt kun et problem, hvis du skal køre rigtig mange af disse små-jobs mod databasen så husk du er færdig på den halve tid med et Recordset.</p>
<p><strong>Dataset skal anvendes, hvor mange af de samme data skal anvendes alsidsigt</strong></p>
<p>Når der skal tælles, hvor mange rækker man har fået ud i et resultat, så må du bede til, at du ikke har anvendt Dataset metoden, det der trækker ned er helt klart at måden hvorpå man skal hive data ud for at få et Dataset ikke egner sig til små resultater, fordi man skal hente hele tabellen med en hel vildt masse egenskaber ud, og det tager bare tid.</p>
<p><strong>Med 10.000 rækker er både LINQ og Recordset over dobbelt så hurtige som Dataset.</strong></p>
<p>Når vi øger antallet af rækker med en faktor 10 til 10.000 rækker stiger test tiderne selvfølgelig, fordi databasen tager længere tid om at sende 10 gange så meget data, men overraskende meget synes jeg. LINQ metoden stiger med en faktor 4,5, Dataset metoden stiger med en faktor 10 og Recordset metoden stiger med en faktor 6,5.</p>
<p><strong>Med 100.000 rækker begynder LINQ at hale gevaldigt ind på Recordset.</strong></p>
<p>Når vi øver antallet af rækker yderligere med en faktor 10 til 100.000 rækker, ville jeg forvente samme stigningsgrad som før med fra 1.000 til 10.000, men nu stiger den endnu mere. LINQ metoden stiger med en faktor 8,7, Dataset metoden med en faktor 9 og Recordset metoden med en faktor 9,5.</p>
<p><a href="http://bit.ly/5JCsPq" target="_blank">Download Visual Studio 2008 Projektet</a></p>
<h2>Testsystem</h2>
<p>Hardware: Bærbar HP Elitebook, 3GB RAM, 2,53GHz Intel Core Duo, 32bit    <br />Software: Windows 7 32bit, SQL Server Express 2009, Visual Studio 2008 Professional Developer Web Server</p>
<h2>Testforløb</h2>
<p>Jeg har opdelt min test i 4 forløb og hver eneste forløb er kørt 10 gange på samme metode for så til sidst at få en gennemsnits tidsforbrug som toneangivende konklusion.</p>
<p><strong>LINQ måling metode</strong></p>
<pre class="code"><span style="color: blue">private void </span>DoLinqTest()
{
    <span style="color: #2b91af">DateTime </span>dtLinqStart = <span style="color: #2b91af">DateTime</span>.Now;
    <span style="color: blue">using </span>( DB.<span style="color: #2b91af">dbDataContext </span>db = <span style="color: blue">new </span>DB.<span style="color: #2b91af">dbDataContext</span>() )
    {
        <span style="color: green">// Execution code
</span>    }
    <span style="color: #2b91af">DateTime </span>dtLinqEnd = <span style="color: #2b91af">DateTime</span>.Now;
    lblLinqTime.Text = ( dtLinqEnd - dtLinqStart ).ToString();
}</pre>
<p><strong>Dataset måling metode</strong></p>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="color: blue">private void </span>DoDataSetTest()
{
    <span style="color: #2b91af">DateTime </span>dtDsStart = <span style="color: #2b91af">DateTime</span>.Now;
    <span style="color: blue">using </span>( <span style="color: #2b91af">SqlConnection </span>dbCon = <span style="color: blue">new </span><span style="color: #2b91af">SqlConnection</span>( <span style="color: #2b91af">ConfigurationManager</span>.ConnectionStrings[ <span style="color: #a31515">&quot;dbConnectionString&quot; </span>].ConnectionString ) )
    {
        <span style="color: blue">using </span>( <span style="color: #2b91af">SqlDataAdapter </span>sqlAdap = <span style="color: blue">new </span><span style="color: #2b91af">SqlDataAdapter</span>( <span style="color: #a31515">&quot;SELECT * FROM item&quot;</span>, dbCon ) )
        {
            <span style="color: #2b91af">DataSet </span>ds = <span style="color: blue">new </span><span style="color: #2b91af">DataSet</span>();
            sqlAdap.Fill( ds );

            <span style="color: green">// Executing code
</span>        }
    }
    <span style="color: #2b91af">DateTime </span>dtDsEnd = <span style="color: #2b91af">DateTime</span>.Now;
    lblDsTime.Text = ( dtDsEnd - dtDsStart ).ToString();
}</pre>
<p><strong>Recordset måling metode</strong></p>
<pre class="code"><span style="color: blue">private void </span>DoRecordSetTest()
{
    <span style="color: #2b91af">DateTime </span>dtRsStart = <span style="color: #2b91af">DateTime</span>.Now;
    <span style="color: blue">using </span>( <span style="color: #2b91af">SqlConnection </span>dbCon = <span style="color: blue">new </span><span style="color: #2b91af">SqlConnection</span>( <span style="color: #2b91af">ConfigurationManager</span>.ConnectionStrings[ <span style="color: #a31515">&quot;dbConnectionString&quot; </span>].ConnectionString ) )
    {
        dbCon.Open();
        <span style="color: blue">using </span>( <span style="color: #2b91af">SqlCommand </span>sqlCmd = <span style="color: blue">new </span><span style="color: #2b91af">SqlCommand</span>( <span style="color: #a31515">&quot;SELECT * FROM item&quot;</span>, dbCon ) )
        {
            <span style="color: blue">using </span>( <span style="color: #2b91af">SqlDataReader </span>rs = sqlCmd.ExecuteReader() )
            {
                <span style="color: green">// Executing code
</span>            }
        }
    }

    <span style="color: #2b91af">DateTime </span>dtRsEnd = <span style="color: #2b91af">DateTime</span>.Now;
    lblRsTime.Text = ( dtRsEnd - dtRsStart ).ToString();
}</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<h2>1. forløb</h2>
<p>En test som ses i <em>Testresultat Sheet: <strong>1000 List</strong></em> på at få 1000 database rækker ud som objekter af flg. type:</p>
<pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">item
</span>{
    <span style="color: blue">public int </span>Id { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }
    <span style="color: blue">public string </span>Name { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }
    <span style="color: blue">public string </span>Description { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }
    <span style="color: blue">public </span><span style="color: #2b91af">DateTime </span>Date { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }

    <span style="color: blue">public </span>item()
    {
    }

}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing LINQ code:</strong></p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt; objItems = ( <span style="color: blue">from </span>itm <span style="color: blue">in </span>db.items
                        <span style="color: blue">select new </span><span style="color: #2b91af">item
                        </span>{
                          Id = itm.id,
                          Name = itm.name,
                          Description = itm.description,
                          Date = itm.date.Value
                        } ).ToList();</pre>
</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Dataset code:</strong></p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt; items = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt;();
<span style="color: #2b91af">DataRow</span>[] drs = ds.Tables[ 0 ].Select();
<span style="color: blue">for </span>( <span style="color: blue">int </span>i = 0; i &lt; drs.Length; i++ )
{
    <span style="color: blue">object</span>[] dbFields = drs[ i ].ItemArray;
    <span style="color: #2b91af">item </span>itm = <span style="color: blue">new </span><span style="color: #2b91af">item</span>();
    itm.Id = ( <span style="color: blue">int </span>)dbFields[ 0 ];
    itm.Name = dbFields[ 1 ].ToString();
    itm.Description = dbFields[ 2 ].ToString();
    itm.Date = ( <span style="color: #2b91af">DateTime </span>)dbFields[ 3 ];
    items.Add( itm );
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Recordset code:</strong></p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt; items = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt;();
<span style="color: blue">while </span>( rs.Read() )
{
  <span style="color: #2b91af">item </span>itm = <span style="color: blue">new </span><span style="color: #2b91af">item</span>();
  itm.Id = rs.GetInt32( 0 );
  itm.Name = rs.GetString( 1 );
  itm.Description = rs.GetString( 2 );
  itm.Date = rs.GetDateTime( 3 );
  items.Add( itm );
}</pre>
<h2>2. forløb</h2>
<p>En test som ses i <em>Testresultat sheet: <strong>1000 Count</strong></em> på at få antallet af rækker ud på en database tabel med 1.000 rækker</p>
<p><strong>Executing LINQ code:</strong></p>
<pre class="code"><span style="color: blue">int </span>count = ( <span style="color: blue">from </span>itm <span style="color: blue">in </span>db.items
              <span style="color: blue">select new </span><span style="color: #2b91af">item
              </span>{
                Id = itm.id,
                Name = itm.name,
                Description = itm.description,
                Date = itm.date.Value
              } ).Count();</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Dataset code:</strong></p>
<pre class="code"><span style="color: blue">int </span>count = ds.Tables[ 0 ].Rows.Count;</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Recordset code:</strong></p>
<pre class="code"><span style="color: blue">int </span>count = 0;
<span style="color: blue">while </span>( rs.Read() )
{
    count++;
}</pre>
<h2>3. forløb</h2>
<p>En test som ses i <em>Testresultat sheet: <strong>10000 List</strong></em> med samme <em>Executing code</em> som 1. forløb, men denne gang på at få 10.000 database rækker ud.</p>
<h2>4. forløb</h2>
<p>En test som ses i <em>Testresultat sheet: <strong>100000 List</strong></em> med samme <em>Executing code</em> som 1. forløb, men denne gang på at få 100.000 database rækker ud.</p>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<h2>Testresultat</h2>
<p><iframe height="350" src="http://spreadsheets.google.com/pub?key=teOEGBYQCg0uWprRiDUjo-A&amp;output=html&amp;widget=true" frameborder="0" width="400"></iframe></p>
<p><a href="http://bit.ly/5JCsPq" target="_blank">Download Visual Studio 2008 Projektet</a></p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/linq-dataset-recordset-performance-resultat.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

