<?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>Intersoft Solutions Corporate Blog &#187; Performance</title>
	<atom:link href="http://blog.intersoftsolutions.com/tag/performance/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.intersoftsolutions.com</link>
	<description>All about development productivity â€“ ASP.NET, Silverlight, WPF, iOS, Android, Windows Phone, Windows 8</description>
	<lastBuildDate>Sat, 21 Apr 2018 06:57:13 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.33</generator>
	<item>
		<title>Improving Crosslight App Performance with Compression Filter</title>
		<link>http://blog.intersoftsolutions.com/2015/09/improving-crosslight-app-performance-with-compression/</link>
		<comments>http://blog.intersoftsolutions.com/2015/09/improving-crosslight-app-performance-with-compression/#comments</comments>
		<pubDate>Thu, 10 Sep 2015 08:53:28 +0000</pubDate>
		<dc:creator><![CDATA[Jimmy Petrus]]></dc:creator>
				<category><![CDATA[2015 R1]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Products]]></category>
		<category><![CDATA[Crosslight]]></category>
		<category><![CDATA[Data Access]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.intersoftsolutions.com/?p=4729</guid>
		<description><![CDATA[In my post last month, I mentioned about data optimization feature in Crosslight 4 which could greatly improve the overall performance and experience of your Crosslight apps. So here we are, this weekâ€™s post will feature this optimization feature, and you will learn how to [...]]]></description>
				<content:encoded><![CDATA[<img width="604" height="270" src="http://blog.intersoftsolutions.com/wp-content/uploads/2015/09/Extensible-Request-and-Response-Filters-604x270.jpg" class="attachment-post-thumbnail wp-post-image" alt="Extensible Request and Response Filters" style="float:right; margin:0 0 10px 10px;" /><p>In <a href="http://blog.intersoftsolutions.com/2015/08/editing-data-with-view-projection/" target="_blank">my post</a> last month, I mentioned about data optimization feature in Crosslight 4 which could greatly improve the overall performance and experience of your Crosslight apps. So here we are, this weekâ€™s post will feature this optimization feature, and you will learn how to apply it to your apps. Read on.</p>
<p>In Crosslight 4, we shipped a lot of <a href="http://intersoftsolutions.com/2015" target="_blank">new stunning components</a> like charting, barcode reader, dialog presenters and much more. But thatâ€™s not all. We also pay a lot of attention on small and unseen areas such as the data framework, logging, and view projection. In fact, no feature is too small. For instance, the new extensible filters in RestClient enable you to add request and response compression and make your apps work 75% faster, particularly if youâ€™re building enterprise apps that sync relatively large data. Letâ€™s see how it works.</p>
<p><a href="http://blog.intersoftsolutions.com/wp-content/uploads/2015/09/Extensible-Request-and-Response-Filters.jpg"><img class="alignnone wp-image-4740" src="http://blog.intersoftsolutions.com/wp-content/uploads/2015/09/Extensible-Request-and-Response-Filters.jpg" alt="Extensible Request and Response Filters" width="700" height="389" /></a></p>
<p>Adding a new request or response filter to the RestClient is extremely easy, thanks to the new, intuitive API. Hereâ€™s how:</p><pre class="crayon-plain-tag">this.GetService&lt;IActivatorService&gt;().Register&lt;IRestClient&gt;(
c =&gt;
{
    RestClient restClient = new RestClient(appSettings.RestServiceUrl);
    restClient.AddRequestFilter(new GZipRequestFilter());
    restClient.AddResponseFilter(new GZipResponseFilter());

    return restClient;
});</pre><p></p>
<blockquote><p>If you&#8217;re using <a href="http://developer.intersoftsolutions.com/display/crosslight/Building+Business+Apps+with+Enterprise+App+Framework" target="_blank">Crosslight App Framework</a>, you can simply add the code in the <a href="http://git.intersoftsolutions.com/projects/CROS-SUPP/repos/rest-filter-samples/browse/RestFilterSamples.Core/Infrastructure/AppService.cs" target="_blank">AppServiceÂ class</a> where allÂ container registrations areÂ defined. The Rest client in the entire app will automatically have the filters applied.</p></blockquote>
<p>Since the filter is provided as interface, you can plug any capabilities you desire, whether it is a compression filter, an encryption filter, etc. In this case, letâ€™s not reinvent the wheel. Weâ€™ll just grab an existing <a href="https://www.nuget.org/packages/Microsoft.Bcl.Compression/3.9.85" target="_blank">Microsoft.Bcl.Compression</a> library from NuGet. Hereâ€™s an example how we can extend a third-party library to work with our filter interface:</p><pre class="crayon-plain-tag">public class GZipRequestFilter : GZipFilter, IRestRequestFilter
{
Â Â Â Â public void Filter(IRestRequest request)
Â Â Â Â {
Â Â Â Â Â Â Â Â request.AddHeader("Accept-Encoding", "gzip, deflate");
Â Â Â Â Â Â Â Â Parameter requestBody = request.Parameters.Where(o =&gt; o.Type == RequestParameterType.RequestBody).FirstOrDefault();

Â Â Â Â Â Â Â Â if (requestBody != null)
Â Â Â Â Â Â Â Â {
Â Â Â Â Â Â Â Â Â Â Â Â request.AddHeader("Content-Encoding", "gzip");
Â Â Â Â Â Â Â Â Â Â Â Â requestBody.Value = this.Compress(requestBody.Value.ToString());
Â Â Â Â Â Â Â Â }
Â Â Â Â }
}

public class GZipResponseFilter : GZipFilter, IRestResponseFilter
{
Â Â Â Â public void Filter(IRestResponse response)
Â Â Â Â {
Â Â Â Â Â Â Â Â Parameter contentEncoding = response.Headers.Where(o =&gt; o.Name == "Content-Encoding").FirstOrDefault();

Â Â Â Â Â Â Â Â if (contentEncoding != null &amp;&amp; contentEncoding.Value.ToString().ToLowerInvariant() == "gzip")
Â Â Â Â Â Â Â Â Â Â Â Â response.Content = this.Decompress(response.RawBytes);
Â Â Â Â }
}</pre><p>As seen above, we can just extend an existing class, say, the <em>GZipFilter</em> class, then implement the <em>IRestRequestFilter</em> and <em>IRestResponseFilter</em>. Both interfaces require an implementation of Filter method, that&#8217;s where you perform the actual logic of the filter.</p>
<p>On the server-side, if youâ€™re using IIS for the web server, then you can just enable the dynamic compression feature. Afterward, the WebAPI response will be automatically compressed.</p>
<p>One thing to note though, WebAPI doesnâ€™t automatically recognize the compressed requests. Fortunately, Microsoft already has a NuGet package for that. So we&#8217;ll just grab the <a href="https://www.nuget.org/packages/Microsoft.AspNet.WebApi.MessageHandlers.Compression/" target="_blank">ASP.NET WebAPI Compression Support</a>, thenÂ add the following code to the WebAPI config class.</p><pre class="crayon-plain-tag">public static class WebApiConfig
{
Â Â Â Â public static void Register(HttpConfiguration config)
Â Â Â Â {
Â Â Â Â Â Â Â Â // Web API configuration and services
Â Â Â Â Â Â Â Â config.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
    }
}</pre><p>Pretty easy, right?</p>
<p>Based on performance test on one of the apps we built for our enterprise client, enabling the compression filters speed up our apps performance by nearly 4x. Previously, in certain case, the app took 9 minutes to synchronize a thousand of data over the Edge connection. With compression enabled, the app only took only 2 minutes to sync the same set of data over Edge, and only a few seconds over Wifi. The user couldnâ€™t be happier. So we hope you can do the same too, your users will thank you so much.</p>
<p>To see the feature in action, <a href="http://git.intersoftsolutions.com/projects/CROS-SUPP/repos/rest-filter-samples/" target="_blank">pull the sample</a> from our Git, and play around with it. The feature is also fully documented, which you can find <a href="http://developer.intersoftsolutions.com/display/crosslight/Optimizing+Data+Access+Performance" target="_blank">here</a>. Happy optimizing!</p>
<p>Best,<br />
Jimmy</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.intersoftsolutions.com/2015/09/improving-crosslight-app-performance-with-compression/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Improve Page Performance in WebGrid When Used With WebMenuBar</title>
		<link>http://blog.intersoftsolutions.com/2010/03/how-to-overcome-slow-page-performance-in-webgrid-autofitcolumns-false-with-webmenubar/</link>
		<comments>http://blog.intersoftsolutions.com/2010/03/how-to-overcome-slow-page-performance-in-webgrid-autofitcolumns-false-with-webmenubar/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 10:06:26 +0000</pubDate>
		<dc:creator><![CDATA[handy23]]></dc:creator>
				<category><![CDATA[2008 R2]]></category>
		<category><![CDATA[2009 R2]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Style]]></category>
		<category><![CDATA[WebDesktop]]></category>
		<category><![CDATA[WebGrid]]></category>
		<category><![CDATA[WebMenuBar]]></category>
		<category><![CDATA[WebToolBar]]></category>

		<guid isPermaLink="false">http://intersoftpt.wordpress.com/?p=1150</guid>
		<description><![CDATA[Recently some customers reported that they experienced performance issue in their page which contains WebGrid along with WebMenuBar control. The issue is noticable when using Internet Explorer browser to view the page. After further research, this performance issue occured only when the Grid has AutoFitColumns [...]]]></description>
				<content:encoded><![CDATA[<p>Recently some customers reported that they experienced performance issue in their page which contains WebGrid along with WebMenuBar control. The issue is noticable when using Internet Explorer browser to view the page. After further research, this performance issue occured only when the Grid has <strong>AutoFitColumns</strong> property set to true while the WebMenuBar is using predefined styles that produced from the server-side settings.</p>
<p>Apparently, Internet Explorer has a serious flaw in performance when a script is trying to add styles programmatically while loading, and at the same time when layouting is performed by other scripts.</p>
<p>To eliminate the performance issue, all styles in WebMenuBar should be defined as CssClass instead of using server-side predefined styles.</p>
<p>For comparison, I have attached two samples (with and without CssClass). Run the <a href="http://www.intersoftpt.com/tdn/downloads/Performance.zip">samples </a>and compare the performance difference between them.</p>
<p>Note: This technique also works on standalone WebToolBar which causes the same issue.</p>
<p>Regards,<br />
Handy.<br />
Support Engineer.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.intersoftsolutions.com/2010/03/how-to-overcome-slow-page-performance-in-webgrid-autofitcolumns-false-with-webmenubar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Timeline viewâ€™s Client Paging in WebScheduler 3</title>
		<link>http://blog.intersoftsolutions.com/2010/01/timeline-views-client-paging-in-webscheduler-3/</link>
		<comments>http://blog.intersoftsolutions.com/2010/01/timeline-views-client-paging-in-webscheduler-3/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 15:35:43 +0000</pubDate>
		<dc:creator><![CDATA[intersoftbram]]></dc:creator>
				<category><![CDATA[2009 R2]]></category>
		<category><![CDATA[Products]]></category>
		<category><![CDATA[Client Paging]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Timeline View]]></category>
		<category><![CDATA[WebScheduler]]></category>
		<category><![CDATA[WebScheduler 3]]></category>

		<guid isPermaLink="false">http://intersoftpt.wordpress.com/?p=1050</guid>
		<description><![CDATA[Hello everyone, Happy New Year 2010! In this post, Iâ€™m going to discuss one of the most exciting features that we added in the recently released WebScheduler. As you may already aware, WebScheduler 3 is strongly focused on performance and usability, especially when used in [...]]]></description>
				<content:encoded><![CDATA[<p>Hello everyone, Happy New Year 2010! In this post, Iâ€™m going to discuss one of the most exciting features that we added in the recently released WebScheduler. As you may already aware, WebScheduler 3 is strongly focused on performance and usability, especially when used in enterprise applications where they require to display large dataset in consistently fast performance. The new <strong>Client Paging </strong>feature in WebScheduler 3 elegantly addresses many of these performance issues.</p>
<p>In the following section, weâ€™ll learn how client paging work specifically in Timeline View (the other views will be discussed in future blog posts). We introduce several client paging modes which can help improving overall application response based on your scenarios.</p>
<p>Letâ€™s start by enabling the client paging in Timeline view. Weâ€™ve made it extremely easy to use, so that you can enable the feature by simply setting <strong>EnableClientPaging</strong> property to true. The property can be found in <strong>ViewSettings</strong>, then expand <strong>TimelineView</strong> property.</p>
<p>After enabling the client paging, the next step is to choose the client paging mode that is more suitable to your application scenario. WebScheduler 3 introduces three client paging mode to choose from:</p>
<ol>
<li>Paging based on number of events<br />
Called <strong>EventPageSize</strong> mode, this paging mode restricts the numbers of event displayed in each Timeline cell. If the total number of events exceeds the value of the <strong>EventPageSize</strong> property, an arrow indicator will appear notifying that more events are available. Click on the arrow indicator to reveal the complete events in the Timeline cell.To use this paging mode, simply set the <strong>ClientPagingMode </strong>property to <em><strong>EventPageSize</strong></em>.</p>
<p><a href="http://intersoftpt.files.wordpress.com/2010/01/clientpaging_eventpagesizepaged1.png"><img class="size-medium wp-image-1053" title="ClientPaging_EventPageSizePaged" src="http://intersoftpt.files.wordpress.com/2010/01/clientpaging_eventpagesizepaged1.png?w=300" alt="" width="300" height="222" /></a><br />
<a href="http://intersoftpt.files.wordpress.com/2010/01/clientpaging_eventpagesizenotpaged1.png"><img class="size-medium wp-image-1054" title="ClientPaging_EventPageSizeNotPaged" src="http://intersoftpt.files.wordpress.com/2010/01/clientpaging_eventpagesizenotpaged1.png?w=300" alt="" width="300" height="231" /></a></li>
<li>Paging based on screen viewport<br />
Called <strong>ViewPort</strong>, this paging mode will render all events based on the currently visible viewport. This means that even if you have hundreds of resources, WebScheduler will present your events in consistently fast performance. When scrolled down, WebScheduler seamlessly render the complete events of the new visible viewport. As the result, this advanced paging mode significantly improves overall responsiveness and user experiences.<br />
You should consider using this paging mode if you have fairly large number of resources bound to your WebScheduler.</p>
<p>To activate this mode, set the <strong>ClientPagingMode </strong>property to <em><strong>ViewPort</strong></em>.</p>
<p><a href="http://intersoftpt.files.wordpress.com/2010/01/viewport1.png"><img class="size-medium wp-image-1055 " title="ViewPort1" src="http://intersoftpt.files.wordpress.com/2010/01/viewport1.png?w=257" alt="" width="257" height="300" /></a></p>
<p><a href="http://intersoftpt.files.wordpress.com/2010/01/viewport2.png"><img class="size-medium wp-image-1056" title="ViewPort2" src="http://intersoftpt.files.wordpress.com/2010/01/viewport2.png?w=255" alt="" width="255" height="300" /></a></li>
<li>The combination of both event size and viewport paging<br />
This mode combines the best of both <em>EventPageSize </em>and <em>ViewPort </em>client paging for the most efficient event rendering. With this mode, the events will be rendered based on the visible viewport and also be restricted based on the number of allowed events.Â This mode is best used for applications with considerably large number of resources and events bound to WebScheduler.</p>
<p>To enable this mode, set <strong>ClientPagingMode </strong>property to <em><strong>Both</strong></em>.</p>
<p><a href="http://intersoftpt.files.wordpress.com/2010/01/clientpaging_bothpaged.png"><img class="size-medium wp-image-1057" title="ClientPaging_BothPaged" src="http://intersoftpt.files.wordpress.com/2010/01/clientpaging_bothpaged.png?w=300" alt="" width="300" height="263" /></a></li>
</ol>
<div id="_mcePaste" style="position:absolute;width:1px;height:1px;overflow:hidden;top:34px;left:-10000px;">&lt;!&#8211;[if gte mso 9]&gt; &lt;![endif]&#8211;&gt;&lt;!&#8211;[if gte mso 9]&gt; Normal 0 false false false EN-US X-NONE X-NONE &lt;![endif]&#8211;&gt;&lt;!&#8211;[if gte mso 9]&gt; &lt;![endif]&#8211;&gt;<!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin-top:0in; 	margin-right:0in; 	margin-bottom:10.0pt; 	margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-bottom:10.0pt; 	line-height:115%;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.0in 1.0in 1.0in; 	mso-header-margin:.5in; 	mso-footer-margin:.5in; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Table Normal&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin-top:0in; 	mso-para-margin-right:0in; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin;} --> &lt;!&#8211;[endif]&#8211;&gt;<em><span style="line-height:115%;font-family:&amp;">Timeline events are displayed when paging arrow indicator is clicked</span></em></div>
<p>At this point, you should have learnt the new key features in WebScheduler 3 that elegantly address critical performance limitations in web-based scheduling application. So if youâ€™ve got large, enterprise data to be presented in scheduling interface, go ahead, <a href="http://www.intersoftpt.com/WebScheduler/Try" target="_blank">download</a> and try WebScheduler 3, and impress your users big time!</p>
<p>Last but not least, you can find out more information on WebScheduler 3â€™s new features <a href="http://www.intersoftpt.com/WebScheduler/NewFeatures" target="_blank">here</a> and the live demos <a href="http://live.intersoftpt.com/Default.aspx?p=/WebScheduler" target="_blank">here</a>. For questions and feedback, please drop by our <a href="http://www.intersoftpt.com/Community/WebScheduler" target="_blank">forum</a>.</p>
<p>Happy scheduling!</p>
<p>Warm Regards,<br />
Budianto Muliawan.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.intersoftsolutions.com/2010/01/timeline-views-client-paging-in-webscheduler-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>First Look: Performance Improvements in WebScheduler 3</title>
		<link>http://blog.intersoftsolutions.com/2009/12/first-look-webscheduler-3s-performance-improvements/</link>
		<comments>http://blog.intersoftsolutions.com/2009/12/first-look-webscheduler-3s-performance-improvements/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 08:20:49 +0000</pubDate>
		<dc:creator><![CDATA[Jimmy Petrus]]></dc:creator>
				<category><![CDATA[2009 R2]]></category>
		<category><![CDATA[Products]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[WebScheduler]]></category>
		<category><![CDATA[WebScheduler 3]]></category>

		<guid isPermaLink="false">http://intersoftpt.wordpress.com/2009/12/16/first-look-webscheduler-3s-performance-improvements/</guid>
		<description><![CDATA[If youâ€™re building a large scale, enterprise resources planning application that involve thousands of resources and events in a single month view alone, you would have quickly realizing serious performance issues during the development process. In this post, Iâ€™ll share some insights on the common [...]]]></description>
				<content:encoded><![CDATA[<img width="447" height="270" src="http://blog.intersoftsolutions.com/wp-content/uploads/2014/09/BenchmarkByBrowser1-580x350.png" class="attachment-post-thumbnail wp-post-image" alt="" style="float:right; margin:0 0 10px 10px;" /><p>If youâ€™re building a large scale, enterprise resources planning application that involve thousands of resources and events in a single month view alone, you would have quickly realizing serious performance issues during the development process. In this post, Iâ€™ll share some insights on the common pitfalls and bottleneck in performance, and how our latest scheduling component completely address them in elegant ways.</p>
<h2>The Challenges</h2>
<p>There are at least 4 factors that would lead to performance issue in most enterprise applications and specifically in scheduling applications.</p>
<ol>
<li><strong>Huge data transfer size.</strong>Take a look at our recent case study on a car rental application. The car rental could have over 3,000 events made in a month. In most scheduling component in the market, all data will be retrieved at once in the page load. That transmits over 2MB of data sent over the cloud which translates to 6-7 seconds waiting even on a broadband connection.</li>
<li><strong>Long rendering process.</strong>With rich user interface possible nowadays, web developers often forgot that a web application is not a desktop application. The nature of web application still have several common constraints such as the amount of elements which are considerably good on a page. In the case of enterprise application, serious performance bottleneck could arise due to the massive objects creation and long rendering process which could take 8-10 seconds for a page bound to several thousands of data.</li>
<li><strong>Heavy backend query.<br />
</strong><br />
Most datasource controls introduced in ASP.NET donâ€™t enable paging by default. While it may not be a significant issue in relatively smaller application, it could be a great showstopper for enterprise application with millions to billions worth of data. Non-optimized database query itself could cause performance issues in at least three ways: the heavier workload and resources required to compute the query, huge data transmission from the backend to business layer and ultimately yielding more extensive operation in the UI layer.</li>
<li><strong>Poor data processing.</strong>Specifically for a scheduling component, poor data processing logic is often a factor that causes performance issue. Scheduler is a unique component that process data in several phases, such as resources categorizing, data grouping and more. Thus, improper data processing logic could result in longer time required to compute the final shape of the data required by the scheduler interface.</li>
</ol>
<h2>The Solution</h2>
<p>WebScheduler 3 is strongly focused on addressing performance issues and improving application scalability at the same time. One of the our key goals is to achieve a consistent performance while loading a scheduler bound to thousands of data â€“ for example, 1-2 seconds regardless of the data size.</p>
<p><strong>ViewPort paging</strong> was born as the result of our extensive R&amp;D. It is specifically designed for Timeline View (Gantt Chart Style) which makes more sense due to its layout nature that display huge data in a single resource. To completely eliminate the key performance issues discussed above, we also invented three more innovative features that work in conjunction with ViewPort paging. They are <strong>event-based client paging, server paging and efficient data categorizing process</strong>.</p>
<p>Instead of loading huge data on every data request, ViewPort paging works by loading only a small chunk of data in the first load which seamlessly fills the data based on the available real screen estate. It will load the rest of data on demand as users scroll downward. Also keep in mind that ViewPort intelligently saves a cache of loaded data, so it wonâ€™t retrieve the same data twice. The result is maximum performance, increased responsiveness and extremely smooth user experiences.</p>
<p>The ViewPort implementation doesnâ€™t merely handle data paging process, itÂ  also takes account every single feature that associated to it, say, new event creation, recurrence editing, and data drilling. It also flawlessly handles a vast array of complex scenarios such as drag-drop operation across resources and time, multiple selections, views switching, and more.</p>
<p>In addition to ViewPort paging, WebScheduler 3 also implements smart client paging to other views including day view, week view,Â  split view and all day area view. We also add client paging interface to the details box in month view.</p>
<p>All in all, WebScheduler 3 successfully delivers on its key objectives to redefine a new standard in performance for enterprise-class usage and improving user experiences at the same time. The following chart shows the performance benchmark tested in various browsers.</p>
<p><img src="http://www.intersoftpt.com/WebResources/Images/WebScheduler/Gallery/BenchmarkByBrowser.png" alt="" /></p>
<p>Our engineers will soon post more coverage on other new exciting features such as customizable time intervals, visible hours, disabled time and more. So stay tuned!</p>
<p>As the word said, pictures worth a million words. Videos worth a zillion. Watch the video below and see the new performance improvements in WebScheduler 3.</p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:fad6f64e-c0f0-47a0-a636-410f9e8088aa" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;">
<div><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='604' height='370' src='http://www.youtube.com/embed/gX6Te-aXf8U?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0' allowfullscreen='true'></iframe></span></div>
<div style="clear:both;font-size:.8em;">WebScheduler 3 Performance Improvements</div>
</div>
<p>You can also experience it yourself by trying our new Blitz rent-a-car reference sample available <a href="http://live.intersoftpt.com/Default.aspx?url=cs/WebScheduler/CarRental.aspx" target="_blank">online</a>.</p>
<h2>Learn More</h2>
<p>WebScheduler 3 is released â€“ <a href="http://www.intersoftpt.com/WebScheduler/Try" target="_blank">download</a> your 30-day trial copy today to experience the exciting new features for yourself.</p>
<p>More resources on WebScheduler 3 can be found in the following links:</p>
<p><a href="http://www.intersoftpt.com/WebScheduler" target="_blank">Overview</a></p>
<p><a href="http://www.intersoftpt.com/WebScheduler/NewFeatures/TurboChargedPerformance" target="_blank">Performance Benchmark and Comparison</a></p>
<p><a href="http://www.intersoftpt.com/WebScheduler/NewFeatures/SmartClientPaging" target="_blank">Powerful Client Paging Capability</a></p>
<p><a href="http://www.intersoftpt.com/WebScheduler/Features" target="_blank">Top New Features</a></p>
<p><a href="http://www.youtube.com/watch?v=KKC_HpSGVCU" target="_blank">Top 10 New Features Video</a></p>
<p><a href="http://live.intersoftpt.com/FolderHome.aspx?p=/WebScheduler" target="_blank">Live Demos</a></p>
<p>All the best,<br />
Jimmy.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.intersoftsolutions.com/2009/12/first-look-webscheduler-3s-performance-improvements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rich Features in Low Client Footprint</title>
		<link>http://blog.intersoftsolutions.com/2009/09/rich-features-in-low-client-footprint/</link>
		<comments>http://blog.intersoftsolutions.com/2009/09/rich-features-in-low-client-footprint/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 11:33:54 +0000</pubDate>
		<dc:creator><![CDATA[jemmyh]]></dc:creator>
				<category><![CDATA[2009 R1]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Products]]></category>
		<category><![CDATA[Client Footprint]]></category>
		<category><![CDATA[IIS 7]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[WebGrid]]></category>

		<guid isPermaLink="false">http://intersoftpt.wordpress.com/?p=918</guid>
		<description><![CDATA[Continuing an existing discussion on client footprint optimization especially when a lot of features in WebGrid are enabled, Iâ€™ve decided to do a little research on the best way to compress these client resources with a balanced server load yet acceptable compression result. In this [...]]]></description>
				<content:encoded><![CDATA[<p>Continuing an existing <a href="http://www.intersoftpt.com/Community/WebGrid/JavaScript-Footprint/" target="_blank">discussion</a> on client footprint optimization especially when a lot of features in WebGrid are enabled, Iâ€™ve decided to do a little research on the best way to compress these client resources with a balanced server load yet acceptable compression result.</p>
<p>In this research, Iâ€™m running on Windows 7 Professional, IIS 7.5, Visual Studio 2008 SP1, and HttpWatch Professional installed with WebGrid Enterprise&#8217;s samples.</p>
<h2>The Challenges</h2>
<p>Using the Enterprise sample with all features enabled, the total size of client resources &#8212; including javascript and styles &#8212; Â is around 1.2 mb with all compression disabled. This would be a potential issue for users in remote area with slower internet connection.</p>
<p align="center"><img class="aligncenter size-full wp-image-921" title="No_Compression" src="http://intersoftpt.files.wordpress.com/2009/09/no_compression.png" alt="No_Compression" width="544" height="325" /></p>
<p align="center"><em>Without compression, the client resources size is around 1.2 mb.</em></p>
<h2>The Solutions</h2>
<p><strong>SmartWebResourcesâ€™ Compression Technology</strong></p>
<p>SmartWebResourcesâ„¢ technology not only introduces unique architecture for hassle-free deployment, it also comes with built-in compression feature with a reasonable result. Simply put the key below in your web.config to enable the compression:</p>
<p><code>&lt;add key="ISNet.WebUI.ISRes_Compressed" value="true" /&gt;</code></p>
<p style="text-align:left;">The result will look like the screenshot below.</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-922" title="SWR_Compression" src="http://intersoftpt.files.wordpress.com/2009/09/swr_compression.png" alt="SWR_Compression" width="544" height="325" /></p>
<p align="center"><em>The SmartWebResourcesâ€™ squeezes client resources to 680 kb, saves roughly 60%.</em></p>
<p><strong>IIS 7 Dynamic Compression</strong></p>
<p>The latest IIS now offers easy customizability in more user friendly format. Unlike its previous version, compression can be enabled without having to edit a certain .config file. You can enable/disable the compression directly in the IIS Manager.</p>
<p><img class="aligncenter size-full wp-image-920" title="IIS_Manager" src="http://intersoftpt.files.wordpress.com/2009/09/iis_manager.png" alt="IIS_Manager" width="544" height="314" /></p>
<p>If you wish to learn more about IIS 7&#8217;s compression, please<a href="http://www.iis.net/" target="_blank"> click here</a>.</p>
<p>The default compression level is 7. The compression level in IIS is, fortunately, customizable although you won&#8217;t find this setting anywhere else in the documentation.</p>
<p>To change the compression level in IIS 7, run the following syntax from command line:</p>
<p><code>[WinDir]System32inetsrvappcmd set config /section:httpCompression<br />
/[name='gzip'].staticCompressionLevel:[CompressionLevel]</code></p>
<p>The acceptable value for compression level is 1 &#8211; 10. Setting the compression level to 10 will instruct the IIS to use the best compression quality which produces the smallest output.Â While itâ€™s great to be able to compact the client resources and deliver very small output to client, it requires a more powerful server for heavier processing and overhead.</p>
<p>In my opinion, the default level is the best option for web applications that run on moderate servers. It doesnâ€™t compress as much as level 9 or 10, but offer less overhead on the server.</p>
<p><img class="aligncenter size-full wp-image-919" title="IIS_Compression" src="http://intersoftpt.files.wordpress.com/2009/09/iis_compression.png" alt="IIS_Compression" width="544" height="325" /></p>
<p align="center"><em>IIS 7 Compression (level 7)</em></p>
<h2>Conclusion</h2>
<p>If you have the direct access to the deployment server which used IIS 7, IIS compression is definitely the best solution to keep your applications speedy with low client resources footprint. However, if youâ€™re hosting your web applications in a shared server, or if you don&#8217;t use IIS 7 yet, then SmartWebResources compression is your best choice. It may not compress as much as IIS, but it still offers reasonable compression result with much lower server overhead.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.intersoftsolutions.com/2009/09/rich-features-in-low-client-footprint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Faster than &#8220;fastest ASP.NET Grid&#8221; &#8211; Part II</title>
		<link>http://blog.intersoftsolutions.com/2008/04/faster-than-fastest-aspnet-grid-part-ii/</link>
		<comments>http://blog.intersoftsolutions.com/2008/04/faster-than-fastest-aspnet-grid-part-ii/#comments</comments>
		<pubDate>Mon, 07 Apr 2008 13:14:58 +0000</pubDate>
		<dc:creator><![CDATA[Jimmy Petrus]]></dc:creator>
				<category><![CDATA[2008 R1]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[DataSource]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[WebGrid]]></category>

		<guid isPermaLink="false">http://intersoftpt.wordpress.com/?p=156</guid>
		<description><![CDATA[I have received several feedback and comments from our blog reader, and it seems like there is certain factors that are not clearly explained with regards of performance topic that I wrote previously. In this post,Â I will try to answer several questions in more details. [...]]]></description>
				<content:encoded><![CDATA[<p>I have received several feedback and comments from our blog reader, and it seems like there is certain factors that are not clearly explained with regards of performance topic that I wrote <a href="http://intersoftpt.wordpress.com/2008/04/04/faster-than-fastest-aspnet-grid/" target="_blank">previously</a>. In this post,Â I will try to answer several questions in more details.</p>
<p><strong>#1 &#8211; Why not using homegrown table for best speed?</strong></p>
<p>Unfortunately, there&#8217;s no remedy when it comes to binding large data table using basic technique. As I mentioned previously, a single .NET&#8217;s Fill method alone already takes 20 seconds to fill 350k data into the dataset. Not to mention the time to populate and dispatch each row into the UI, it will take at least 25 seconds until rendering.</p>
<p>If you have a large datatable, you can give it a spin using the following sample:</p>
<p><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">&lt;</span></span><span style="font-size:x-small;color:#a31515;"><span style="font-size:x-small;color:#a31515;">asp</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">:</span></span><span style="font-size:x-small;color:#a31515;"><span style="font-size:x-small;color:#a31515;">GridView</span></span><span style="font-size:x-small;"> </span><span style="font-size:x-small;color:#ff0000;"><span style="font-size:x-small;color:#ff0000;">ID</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">=&#8221;GridView1&#8243;</span></span><span style="font-size:x-small;"> </span><span style="font-size:x-small;color:#ff0000;"><span style="font-size:x-small;color:#ff0000;">runat</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">=&#8221;server&#8221;</span></span><span style="font-size:x-small;"> </span><span style="font-size:x-small;color:#ff0000;"><span style="font-size:x-small;color:#ff0000;">AllowPaging</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">=&#8221;True&#8221; </span></span><span style="font-size:x-small;color:#ff0000;"><span style="font-size:x-small;color:#ff0000;">AllowSorting</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">=&#8221;True&#8221;</span></span><span style="font-size:x-small;"> </span><span style="font-size:x-small;color:#ff0000;"><span style="font-size:x-small;color:#ff0000;">AutoGenerateColumns</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">=&#8221;False&#8221;</span></span><span style="font-size:x-small;"> </span><span style="font-size:x-small;color:#ff0000;"><span style="font-size:x-small;color:#ff0000;">DataKeyNames</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">=&#8221;ID&#8221; </span></span><span style="font-size:x-small;color:#ff0000;"><span style="font-size:x-small;color:#ff0000;">DataSourceID</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">=&#8221;SqlDataSource1&#8243;&gt;<br />
</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">Â Â  &lt;</span></span><span style="font-size:x-small;color:#a31515;"><span style="font-size:x-small;color:#a31515;">Columns</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">&gt;<br />
Â Â Â Â Â Â Â  [&#8230;Columns]<br />
<span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">Â Â  &lt;/</span></span><span style="font-size:x-small;color:#a31515;"><span style="font-size:x-small;color:#a31515;">Columns</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">&gt;<br />
</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">&lt;/</span></span><span style="font-size:x-small;color:#a31515;"><span style="font-size:x-small;color:#a31515;">asp</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">:</span></span><span style="font-size:x-small;color:#a31515;"><span style="font-size:x-small;color:#a31515;">GridView</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">&gt;</p>
<div><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;"></span></span></span></div>
<p></span></span></span></span></p>
<div><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">&lt;</span></span><span style="font-size:x-small;color:#a31515;"><span style="font-size:x-small;color:#a31515;">asp</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">:</span></span><span style="font-size:x-small;color:#a31515;"><span style="font-size:x-small;color:#a31515;">SqlDataSource</span></span><span style="font-size:x-small;"> </span><span style="font-size:x-small;color:#ff0000;"><span style="font-size:x-small;color:#ff0000;">ID</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">=&#8221;SqlDataSource1&#8243;</span></span><span style="font-size:x-small;"> </span><span style="font-size:x-small;color:#ff0000;"><span style="font-size:x-small;color:#ff0000;">runat</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">=&#8221;server&#8221; </span></span><span style="font-size:x-small;color:#ff0000;"><span style="font-size:x-small;color:#ff0000;">ConnectionString</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">=&#8221;</span></span><span style="font-size:x-small;">&lt;%$ ConnectionStrings:LargeDataConnectionString2 %&gt;</span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">&#8220;&gt;</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">&lt;/</span></span><span style="font-size:x-small;color:#a31515;"><span style="font-size:x-small;color:#a31515;">asp</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">:</span></span><span style="font-size:x-small;color:#a31515;"><span style="font-size:x-small;color:#a31515;">SqlDataSource</span></span><span style="font-size:x-small;color:#0000ff;"><span style="font-size:x-small;color:#0000ff;">&gt;</span></span>Â Â </p>
<p></span></span></div>
<p>If the above sample can be bound to 350k data in less than 20 seconds, I&#8217;m interested to learn further.</p>
<p><strong>#2 &#8211; I guess we can use SqlDataSource with DataReader modeÂ and bind it to GridView.</strong></p>
<p>Unfortunately, DataReader mode in SqlDataSource won&#8217;t work with Paging and the rest of databound features. So, SqlDataSource is totally unviable.</p>
<p><strong>#3 &#8211; How about ObjectDataSource, or other built-in datasource controls that come with ASP.NET?</strong></p>
<p>ObjectDataSource does support paging, but it falls into the same bottleneck as it used DataAdapter to fetch the results into a DataSet. The pagination is done at server-side control level and not at database level, and hence, it will result into the same 20 seconds performance hit.</p>
<p>So at this time, none of the built-in datasource controls (or the GridView) can bound to a large data table efficiently.</p>
<p><strong>#4 &#8211; Isn&#8217;t it inefficient to bound to such a large table? I think in real world scenarios, you should have a predefined filter for data fetching.</strong></p>
<p>Good shot. AlthoughÂ our GridÂ supports large table binding, we often recommend customers to load and retrieve data efficiently by either using predefined filter or asked user to enter some search criteria before requesting data. Best designÂ &amp; pattern in application architectureÂ is always our first priority and suggestion.</p>
<p>However, the large table binding is unavoidable in several enterprise scenarios. For a quick real-world scenario, administrator often need to browse a table of their Sql database via Web in order to maintain the data records (or perhaps updating records). As business growth, the table might contain more records. In this situation, if the deployed data grid is not able to display the data in acceptable timing, the administrator will waste his entire day in waiting the Web page to response.</p>
<p>For us, it&#8217;s extremely important to support such enterprise scenarios (as we utilized it in our own internal application as well).</p>
<p><strong>Conclusion</strong></p>
<p>Performance is always a hot topic in software industry, especially in reusable component industry as it becomes foundation and backbone of many enterprises Web application. Some products are good in styles, but not performance. Some are good in performance, but not styles.</p>
<p><a href="http://www.intersoftpt.com/WebGrid" target="_blank">WebGrid.NET Enterprise </a>is striving to deliver both the best user experience and styles, and performance.</p>
<p>In addition to the measurement factors that I used in my initial post, there are several more important points that worth mentioned.</p>
<ul>
<li><strong>Database agnostics</strong>. Unlike competing products, WebGrid supports large data binding to any kind of database through ISDataSource control. You can bind to Sql Server, Access, Oracle and even your own custom object collection.</li>
<li><strong>Bare-metal architecture and elegant binding approach</strong>.Â Many developers endÂ up withÂ &#8220;tricky workaround&#8221; to achieve faster results. While this may work, it is not quite reusable in other pages, as many codes are involved in the page&#8217;s code behind. ISDataSource embraces an elegant and professional approach, which works consistently with the entire reusability concept that it introduced.Â<br />
Â<br />
Surprisingly, the sample that I mentioned in the previous post doesn&#8217;t contain any single line of codes related to the databinding or data retrieval in the page&#8217;s code behind. The Webform is completely declarative, while the actual codes are done in <em>GetData</em> method, which is defined at ISDataSource level (and works consistently with datasource control architecture that introduced in ASP.NET 2.0). This allows you to create as many pages as you like, and simply refer to the desired data object without the need for extra coding. It&#8217;s that simple.</li>
</ul>
<p>Next, we will make available an in-depthÂ knowledge base article that explains the technique we used in the sample. It&#8217;s unfortunate that we can&#8217;t ship the sample in our product installerÂ due to the size of the large database sample (which is around 500MB in size).</p>
<p>I hope this post satisfies your hunger in knowing and learning more about some performance topics in our products. Enjoy, and have a nice day <img src="http://blog.intersoftsolutions.com/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Best Regards,<br />
Jimmy.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.intersoftsolutions.com/2008/04/faster-than-fastest-aspnet-grid-part-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
