// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= DevFaqUIResponsiveness
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqUIResponsiveness
:description: Apache NetBeans wiki DevFaqUIResponsiveness
:toc: left
:toc-title:
:syntax: true

== I am developing a NetBeans module. What performance criteria should it satisfy?

All NetBeans modules should behave responsibly with regard to performance. They must not affect startup time negatively, they must not increase memory footprint significantly, and they must be responsive at all times.

* *startup* - module initialization should be as lazy as possible, not to increase startup time
* *memory footprint* - heap space allocated by module's data structures should be freed as soon as not needed; excessive caching of data is not good
* *UI responsiveness* - a module's actions, menus and windows should satisfy the UI responsiveness guidelines as stated in link:UI_Responsiveness.asciidoc[UI_Responsiveness]

---
Applies to: NetBeans 6.5 and above

Platforms: All

== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqUIResponsiveness[http://wiki.netbeans.org/DevFaqUIResponsiveness] , 
that was last modified by NetBeans user Jglick 
on 2010-06-14T20:16:04Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
