From fba9157513bf1cc780ad7e43fafb0f1fcc758b2c Mon Sep 17 00:00:00 2001 From: harshilp24 Date: Wed, 25 Sep 2024 17:13:24 +0530 Subject: [PATCH 1/7] feat: Performance Best Practices --- .../build-apps/performance-best-practices.md | 186 ++++++++++++++++++ website/sidebars.js | 1 + 2 files changed, 187 insertions(+) create mode 100644 website/docs/build-apps/performance-best-practices.md diff --git a/website/docs/build-apps/performance-best-practices.md b/website/docs/build-apps/performance-best-practices.md new file mode 100644 index 0000000000..9aa40c1e33 --- /dev/null +++ b/website/docs/build-apps/performance-best-practices.md @@ -0,0 +1,186 @@ +# Performance Best Practices + +This page provides essential performance best practices to help you optimize your Appsmith applications, covering both client-side and server-side improvements to ensure a smooth and efficient user experience. + +## Optimizing the Client Side of Your App + +Client-side optimization improves app performance on user devices by enhancing load times and responsiveness. This section covers best practices like reducing API calls and optimizing widget usage to create a smoother user experience. + +### 1. Limit the number of widgets on a single page + +Appsmith loads all widgets on a page at once, including those that are hidden or conditionally visible, which can impact performance. Organizing your app content across multiple pages, rather than cramming everything into a single page, enhances both performance and user experience. + +- Organize your application content across multiple pages to enhance performance and improve user experience, rather than placing everything on a single page. + +- Navigate between pages using the `navigateTo("PageName")` function, similar to hyperlinks on websites. This helps manage loosely related content without overloading a single page. For more information, see [Share Data Across Pages](/advanced-concepts/sharing-data-across-pages#use-query-parameters). + +- Minimize the number of hidden or conditionally visible widgets (like Modals) on a page to reduce performance impact. + +- Limit nesting widgets, especially in complex Tabs or Forms. Use the widget pane to track all widgets on a page and manage visibility effectively. + +- Use Pages Over Tabs: + +
+- For distinct workflows or processes that are independent (different datasources). +- For related content from the same datasource but needing different filters or views. +
+ + +### 2. Optimize JavaScript Code + +Optimizing your JavaScript code is crucial for enhancing application performance in Appsmith. With the flexibility to use various data structures and algorithms, it’s essential to choose efficient methods to minimize time and space complexities. Below are recommendations to ensure your JavaScript code runs efficiently: + +- Use well-established libraries like lodash for common operations, as they are optimized and tested by the community. See [Use External JS Libraries](/core-concepts/writing-code/ext-libraries). + +- Use JavaScript functions like `performance.now()` and `console.time()` in your browser’s developer console to identify latency issues and optimize the slow parts of your code. + +- Keep the use of global variables to a minimum to avoid memory leaks and ensure better performance. + +- Implement asynchronous functions to improve responsiveness and prevent blocking of the main thread during data processing. + +- Cache results of expensive calculations or data-fetching operations to prevent redundant processing. + +### 3. Make efficient use of Appsmith’s key-value store + +Appsmith’s key-value store serves as a wrapper around JavaScript’s local storage functions—`localStorage` and `sessionStorage`—to facilitate data persistence. While it is essential for sharing application data across pages, improper usage can negatively impact performance. Below are some recommendations to optimize the use of the key-value store in your applications: + +
+ +* **Batch `storeValue()` Calls:** When you have multiple related variables to store, combine them into a single [`storeValue()`](/reference/appsmith-framework/widget-actions/store-value) call instead of making multiple calls. This reduces overhead and enhances performance. + +
+ +Example: Instead of calling `storeValue()` multiple times in a loop: + +```js +for (let i = 0; i < 100; i++) { + storeValue("key" + i, valueArray[i]); +} +``` + +Use: + + +```js +const valuesToStore = {}; +for (let i = 0; i < 100; i++) { + valuesToStore["key" + i] = valueArray[i]; +} +storeValue("batchData", valuesToStore); // Store all values at once +``` +
+ +* **Leverage JS Object Mutations**: If you’re keeping data purely on the client side and do not need to pass it to the server, consider using JS Object variable mutation. This approach can offer better performance than using `storeValue()`. + +
+ +```js +export default { + // Create a global variable + name: 'sam', + + // Return the value of the global variable + fetch_name () { + return this.name; + }, + + //Update the value of the global variable + update_name () { + this.name = 'ben'; + return this.name; + }, +} +``` + +- Minimize the frequency of `storeValue()` calls, especially in loops or frequent events, to avoid performance hits. + +- Regularly check and remove keys from the key-value store that are no longer needed to free up storage space and improve performance. + +For more best practices on JavaScript, see [Best Practices](/write-code/best-practices#use-mutable-js-variables). + +
+ + + +### 4. Review Page Load Queries + +
+ +When developing applications in Appsmith, you can set certain queries and JavaScript Object functions to trigger automatically on page load. However, during the development process, these queries may become unnecessary, leading to unwanted operations that can negatively affect page performance. + +* To optimize page load times, it is essential to review the queries set to run on page load and disable any that are not required. + +* Regularly check the queries that are triggered on page load and disable those that are not needed to enhance performance. +Implement Lazy Loading: Fetch only the data necessary for the initial view, and defer other data retrieval until it is required by the user. This approach minimizes initial loading time and improves user experience. + +
+ + + +### 5. Offload Heavy Client-Side Computation to the Server + +
+ +The performance of client-side code is significantly influenced by the specifications of the client device. While more powerful systems can execute applications more efficiently, devices with lower processing capabilities may struggle, resulting in suboptimal performance. + +To enhance the performance of applications, especially those targeting low-performance devices such as mobile phones, it is crucial to minimize the computational load on the client side. Offloading complex calculations to the server or data sources can help maintain optimal performance and improve user experience. + +* Reduce the amount of heavy computation performed on the client to ensure smooth performance on all devices. +* Utilize the capabilities of your datasources to perform complex calculations, returning only the results to the client for display. + +
+ +### 6. Disable Unnecessary Browser Extensions + +
+ +Browser extensions, especially development tools like React and Redux plugins, can significantly impact your development environment's performance. While you can't control the browser environment for end users, you can optimize your own development experience by managing these extensions. + +Disabling unnecessary extensions helps reduce browser overhead, leading to a more responsive and efficient development process, free from interference caused by redundant tools. + +* Disable unnecessary extensions from your browser's extensions or add-ons menu. +* Temporarily deactivate React and Redux DevTools when they are not required for debugging. + +
+ + +## Optimizing the Server Side of Your App + +The server side of your app handles all backend operations, including data processing, database interactions, and API requests. Optimizing the server side is crucial for reducing response times, improving scalability, and ensuring a smooth user experience, especially under high load. + +To enhance server performance, it’s important to focus on efficient resource management, robust error handling, and minimizing unnecessary operations. The following sections outline best practices you can follow to optimize the server side of your application. + +### 1. Profile Server Calls + +
+ +Identifying slow server calls is crucial for diagnosing performance issues in your application. Latency from the server side often indicates that queries or API requests are not optimized. By profiling these calls, you can pinpoint bottlenecks and focus on optimizing them for better performance. + +- Check the Query editor to view execution times for your server calls. This helps you identify which queries are slow and need optimization. + +- If you're using custom JavaScript code to make server calls, use tools like `performance.now()` or `console.time()` to measure the performance of individual code segments. + +- Use database-specific profiling tools such as the MongoDB Database Profiler or SQL Server Profiler to analyze and optimize the underlying queries. + +
+ +### 2. Optimize Queries + +
+ +Optimizing queries is crucial for enhancing the performance of your application, as inefficient queries can lead to slow response times and increased server load. While best practices like using indexes are commonly applicable for SQL databases, the optimization techniques can vary significantly depending on the datasource. Additionally, the size of query responses can impact performance, so it’s important to manage data effectively. + +- Break down large datasets into smaller batches using server-side pagination. This helps avoid overwhelming the client with large amounts of data and improves load times. Appsmith supports this feature natively if your datasource is configured to handle pagination. See [Setup Server-Side Pagination on Table](/build-apps/how-to-guides/Server-side-pagination-in-table). + +- Use indexes on frequently queried columns to speed up search operations and reduce query execution time. This is especially useful for SQL databases. + +- If performance issues persist despite optimization, consider that the issue might be with the third-party datasource's backend infrastructure. Switching to a different provider may be necessary for better performance. + +
+ +### 3. Upgrade Server Specifications + +
+Even after optimizing both the front end and back end, performance issues may persist if your server hardware is not powerful enough to handle the load. In such cases, upgrading your server specifications can be the final step to achieve the desired performance levels. This could involve enhancing your on-premises hardware or scaling up your cloud infrastructure. + +
\ No newline at end of file diff --git a/website/sidebars.js b/website/sidebars.js index c4f8f3529c..645022e16d 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -544,6 +544,7 @@ const sidebars = { 'learning-and-resources/sample-apps' ], }, //Reference End + 'build-apps/performance-best-practices', ] }, //Build Apps end From 5446dc942ccae0037d955757018a02a93cab236f Mon Sep 17 00:00:00 2001 From: harshilp24 Date: Thu, 26 Sep 2024 17:28:00 +0530 Subject: [PATCH 2/7] .. --- .../build-apps/performance-best-practices.md | 101 ++++++++---------- website/static/img/disable-onpageload.webp | Bin 0 -> 38436 bytes website/static/img/query-edt.webp | Bin 0 -> 42826 bytes 3 files changed, 44 insertions(+), 57 deletions(-) create mode 100644 website/static/img/disable-onpageload.webp create mode 100644 website/static/img/query-edt.webp diff --git a/website/docs/build-apps/performance-best-practices.md b/website/docs/build-apps/performance-best-practices.md index 9aa40c1e33..b1b73f1853 100644 --- a/website/docs/build-apps/performance-best-practices.md +++ b/website/docs/build-apps/performance-best-practices.md @@ -2,51 +2,43 @@ This page provides essential performance best practices to help you optimize your Appsmith applications, covering both client-side and server-side improvements to ensure a smooth and efficient user experience. -## Optimizing the Client Side of Your App +## Optimizing the client side of your app Client-side optimization improves app performance on user devices by enhancing load times and responsiveness. This section covers best practices like reducing API calls and optimizing widget usage to create a smoother user experience. -### 1. Limit the number of widgets on a single page +### Limit the number of widgets on a single page -Appsmith loads all widgets on a page at once, including those that are hidden or conditionally visible, which can impact performance. Organizing your app content across multiple pages, rather than cramming everything into a single page, enhances both performance and user experience. +Appsmith loads all widgets on a page at once, including those that are hidden or conditionally visible, which can impact performance. - Organize your application content across multiple pages to enhance performance and improve user experience, rather than placing everything on a single page. -- Navigate between pages using the `navigateTo("PageName")` function, similar to hyperlinks on websites. This helps manage loosely related content without overloading a single page. For more information, see [Share Data Across Pages](/advanced-concepts/sharing-data-across-pages#use-query-parameters). +- Navigate between pages using the `navigateTo("PageName")` function, similar to hyperlinks on websites. This helps manage loosely related content without overloading a single page. For more information, see [Share data across pages](/advanced-concepts/sharing-data-across-pages#use-query-parameters). - Minimize the number of hidden or conditionally visible widgets (like Modals) on a page to reduce performance impact. - Limit nesting widgets, especially in complex Tabs or Forms. Use the widget pane to track all widgets on a page and manage visibility effectively. -- Use Pages Over Tabs: -
-- For distinct workflows or processes that are independent (different datasources). -- For related content from the same datasource but needing different filters or views. -
- - -### 2. Optimize JavaScript Code +### Optimize JavaScript code Optimizing your JavaScript code is crucial for enhancing application performance in Appsmith. With the flexibility to use various data structures and algorithms, it’s essential to choose efficient methods to minimize time and space complexities. Below are recommendations to ensure your JavaScript code runs efficiently: -- Use well-established libraries like lodash for common operations, as they are optimized and tested by the community. See [Use External JS Libraries](/core-concepts/writing-code/ext-libraries). +- Use well-established libraries like lodash for common operations, as they are optimized and tested by the community. See [how to use external JS libraries](/core-concepts/writing-code/ext-libraries). - Use JavaScript functions like `performance.now()` and `console.time()` in your browser’s developer console to identify latency issues and optimize the slow parts of your code. - Keep the use of global variables to a minimum to avoid memory leaks and ensure better performance. -- Implement asynchronous functions to improve responsiveness and prevent blocking of the main thread during data processing. +- Implement [asynchronous](/core-concepts/writing-code/javascript-promises#asyncawait) functions to improve responsiveness and prevent blocking of the main thread during data processing. -- Cache results of expensive calculations or data-fetching operations to prevent redundant processing. -### 3. Make efficient use of Appsmith’s key-value store +### Make efficient use of Appsmith’s key-value store Appsmith’s key-value store serves as a wrapper around JavaScript’s local storage functions—`localStorage` and `sessionStorage`—to facilitate data persistence. While it is essential for sharing application data across pages, improper usage can negatively impact performance. Below are some recommendations to optimize the use of the key-value store in your applications: -
-* **Batch `storeValue()` Calls:** When you have multiple related variables to store, combine them into a single [`storeValue()`](/reference/appsmith-framework/widget-actions/store-value) call instead of making multiple calls. This reduces overhead and enhances performance. + +* **Batch `storeValue()` Calls:** When you have multiple related variables to store, combine them into a single [storeValue()](/reference/appsmith-framework/widget-actions/store-value) call instead of making multiple calls. This reduces overhead and enhances performance.
@@ -70,7 +62,7 @@ storeValue("batchData", valuesToStore); // Store all values at once ```
-* **Leverage JS Object Mutations**: If you’re keeping data purely on the client side and do not need to pass it to the server, consider using JS Object variable mutation. This approach can offer better performance than using `storeValue()`. +* **Leverage JS Object Mutations**: If you’re keeping data purely on the client side and do not need to pass it to the server, consider using JSObject variable mutation. This approach can offer better performance than using `storeValue()`.
@@ -92,95 +84,90 @@ export default { } ``` -- Minimize the frequency of `storeValue()` calls, especially in loops or frequent events, to avoid performance hits. +- Limit `storeValue()` calls, especially in loops or frequent events. -- Regularly check and remove keys from the key-value store that are no longer needed to free up storage space and improve performance. +- Regularly clean up unused keys from the key-value store to free up space and improve performance. -For more best practices on JavaScript, see [Best Practices](/write-code/best-practices#use-mutable-js-variables). -
+For more best practices on JavaScript, see [Best Practices](/write-code/best-practices#use-mutable-js-variables). -### 4. Review Page Load Queries -
-When developing applications in Appsmith, you can set certain queries and JavaScript Object functions to trigger automatically on page load. However, during the development process, these queries may become unnecessary, leading to unwanted operations that can negatively affect page performance. +### Review page load queries -* To optimize page load times, it is essential to review the queries set to run on page load and disable any that are not required. +You can configure queries and JavaScript functions to run automatically when a page loads. However, unnecessary page load queries can slow down performance, especially during development. -* Regularly check the queries that are triggered on page load and disable those that are not needed to enhance performance. -Implement Lazy Loading: Fetch only the data necessary for the initial view, and defer other data retrieval until it is required by the user. This approach minimizes initial loading time and improves user experience. - -
+* Regularly review and disable any queries set to run on page load that are no longer necessary. +
+ -### 5. Offload Heavy Client-Side Computation to the Server -
-The performance of client-side code is significantly influenced by the specifications of the client device. While more powerful systems can execute applications more efficiently, devices with lower processing capabilities may struggle, resulting in suboptimal performance. +
-To enhance the performance of applications, especially those targeting low-performance devices such as mobile phones, it is crucial to minimize the computational load on the client side. Offloading complex calculations to the server or data sources can help maintain optimal performance and improve user experience. +* Implement Lazy Loading by fetching only essential data initially, and loading additional data as needed, such as triggering queries on button clicks. See [Trigger UI Actions](/core-concepts/writing-code/ui-actions). -* Reduce the amount of heavy computation performed on the client to ensure smooth performance on all devices. -* Utilize the capabilities of your datasources to perform complex calculations, returning only the results to the client for display. - -### 6. Disable Unnecessary Browser Extensions +### Shift heavy computations to the server -
-Browser extensions, especially development tools like React and Redux plugins, can significantly impact your development environment's performance. While you can't control the browser environment for end users, you can optimize your own development experience by managing these extensions. +To improve application performance, especially for users with less powerful devices, it’s important to reduce the computational burden on the client side. By offloading complex calculations to the server or datasources, you can enhance performance and provide a better user experience. -Disabling unnecessary extensions helps reduce browser overhead, leading to a more responsive and efficient development process, free from interference caused by redundant tools. +*Example:* Instead of calculating a large dataset's statistics (like averages or totals) on the client side, send a request to the server to perform these calculations. The server can handle the heavy lifting and return just the results. -* Disable unnecessary extensions from your browser's extensions or add-ons menu. -* Temporarily deactivate React and Redux DevTools when they are not required for debugging. -
-## Optimizing the Server Side of Your App +## Optimizing the Server Side of your app The server side of your app handles all backend operations, including data processing, database interactions, and API requests. Optimizing the server side is crucial for reducing response times, improving scalability, and ensuring a smooth user experience, especially under high load. To enhance server performance, it’s important to focus on efficient resource management, robust error handling, and minimizing unnecessary operations. The following sections outline best practices you can follow to optimize the server side of your application. -### 1. Profile Server Calls +### Profile Server Calls -
Identifying slow server calls is crucial for diagnosing performance issues in your application. Latency from the server side often indicates that queries or API requests are not optimized. By profiling these calls, you can pinpoint bottlenecks and focus on optimizing them for better performance. + + - Check the Query editor to view execution times for your server calls. This helps you identify which queries are slow and need optimization. - If you're using custom JavaScript code to make server calls, use tools like `performance.now()` or `console.time()` to measure the performance of individual code segments. - Use database-specific profiling tools such as the MongoDB Database Profiler or SQL Server Profiler to analyze and optimize the underlying queries. -
-### 2. Optimize Queries -
+### Optimize Queries + + -Optimizing queries is crucial for enhancing the performance of your application, as inefficient queries can lead to slow response times and increased server load. While best practices like using indexes are commonly applicable for SQL databases, the optimization techniques can vary significantly depending on the datasource. Additionally, the size of query responses can impact performance, so it’s important to manage data effectively. +Optimizing queries is essential for improving your application's performance. Inefficient queries can slow down response times and increase server load. Here are key points to consider: -- Break down large datasets into smaller batches using server-side pagination. This helps avoid overwhelming the client with large amounts of data and improves load times. Appsmith supports this feature natively if your datasource is configured to handle pagination. See [Setup Server-Side Pagination on Table](/build-apps/how-to-guides/Server-side-pagination-in-table). +- Break down large datasets into smaller batches using server-side pagination. Appsmith supports this feature natively if your datasource is configured to handle pagination. See [How to Setup Server-Side Pagination on Table](/build-apps/how-to-guides/Server-side-pagination-in-table). - Use indexes on frequently queried columns to speed up search operations and reduce query execution time. This is especially useful for SQL databases. - If performance issues persist despite optimization, consider that the issue might be with the third-party datasource's backend infrastructure. Switching to a different provider may be necessary for better performance. -
- -### 3. Upgrade Server Specifications +### Upgrade Server Specifications
-Even after optimizing both the front end and back end, performance issues may persist if your server hardware is not powerful enough to handle the load. In such cases, upgrading your server specifications can be the final step to achieve the desired performance levels. This could involve enhancing your on-premises hardware or scaling up your cloud infrastructure. + +If performance issues continue despite optimizing your front end and back end, your server hardware may need an upgrade. Enhancing your on-premises hardware or scaling up your cloud infrastructure can help you achieve better performance levels.
\ No newline at end of file diff --git a/website/static/img/disable-onpageload.webp b/website/static/img/disable-onpageload.webp new file mode 100644 index 0000000000000000000000000000000000000000..00cc37bcc68a013a59769065e9a460f1778fcac5 GIT binary patch literal 38436 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 literal 0 HcmV?d00001 diff --git a/website/static/img/query-edt.webp b/website/static/img/query-edt.webp new file mode 100644 index 0000000000000000000000000000000000000000..4c39cf96574300c7d3e54c781654fcd98e5c8d8e GIT binary patch literal 42826 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�dCX{R*D>T|W+A3yE( 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 E10w Date: Thu, 26 Sep 2024 17:29:59 +0530 Subject: [PATCH 3/7] .. --- website/docs/build-apps/performance-best-practices.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/build-apps/performance-best-practices.md b/website/docs/build-apps/performance-best-practices.md index b1b73f1853..a3b4a3bcf6 100644 --- a/website/docs/build-apps/performance-best-practices.md +++ b/website/docs/build-apps/performance-best-practices.md @@ -62,7 +62,7 @@ storeValue("batchData", valuesToStore); // Store all values at once ``` -* **Leverage JS Object Mutations**: If you’re keeping data purely on the client side and do not need to pass it to the server, consider using JSObject variable mutation. This approach can offer better performance than using `storeValue()`. +* **Leverage JS Object Mutations**: If you’re keeping data purely on the client side and do not need to pass it to the server, consider using JSObject variable [mutation](/write-code/best-practices#use-mutable-js-variables). This approach can offer better performance than using `storeValue()`.
@@ -127,7 +127,7 @@ To improve application performance, especially for users with less powerful devi -## Optimizing the Server Side of your app +## Optimizing the server side of your app The server side of your app handles all backend operations, including data processing, database interactions, and API requests. Optimizing the server side is crucial for reducing response times, improving scalability, and ensuring a smooth user experience, especially under high load. From 8d66c36bbd49d745857dfa1365d53aacd6639723 Mon Sep 17 00:00:00 2001 From: harshilp24 Date: Thu, 26 Sep 2024 22:28:34 +0530 Subject: [PATCH 4/7] .. --- website/docs/build-apps/performance-best-practices.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/website/docs/build-apps/performance-best-practices.md b/website/docs/build-apps/performance-best-practices.md index a3b4a3bcf6..852d0b6b00 100644 --- a/website/docs/build-apps/performance-best-practices.md +++ b/website/docs/build-apps/performance-best-practices.md @@ -133,7 +133,7 @@ The server side of your app handles all backend operations, including data proce To enhance server performance, it’s important to focus on efficient resource management, robust error handling, and minimizing unnecessary operations. The following sections outline best practices you can follow to optimize the server side of your application. -### Profile Server Calls +### Profile server calls Identifying slow server calls is crucial for diagnosing performance issues in your application. Latency from the server side often indicates that queries or API requests are not optimized. By profiling these calls, you can pinpoint bottlenecks and focus on optimizing them for better performance. @@ -152,7 +152,7 @@ Identifying slow server calls is crucial for diagnosing performance issues in yo -### Optimize Queries +### Optimize queries @@ -164,10 +164,9 @@ Optimizing queries is essential for improving your application's performance. In - If performance issues persist despite optimization, consider that the issue might be with the third-party datasource's backend infrastructure. Switching to a different provider may be necessary for better performance. -### Upgrade Server Specifications +### Upgrade server specifications + -
If performance issues continue despite optimizing your front end and back end, your server hardware may need an upgrade. Enhancing your on-premises hardware or scaling up your cloud infrastructure can help you achieve better performance levels. -
\ No newline at end of file From 88960c4c6808de92f684abd1a95869b5ae3e7188 Mon Sep 17 00:00:00 2001 From: harshilp24 Date: Fri, 27 Sep 2024 00:53:42 +0530 Subject: [PATCH 5/7] .. --- .../docs/build-apps/performance-best-practices.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/website/docs/build-apps/performance-best-practices.md b/website/docs/build-apps/performance-best-practices.md index 852d0b6b00..61c5e906db 100644 --- a/website/docs/build-apps/performance-best-practices.md +++ b/website/docs/build-apps/performance-best-practices.md @@ -21,7 +21,7 @@ Appsmith loads all widgets on a page at once, including those that are hidden or ### Optimize JavaScript code -Optimizing your JavaScript code is crucial for enhancing application performance in Appsmith. With the flexibility to use various data structures and algorithms, it’s essential to choose efficient methods to minimize time and space complexities. Below are recommendations to ensure your JavaScript code runs efficiently: +With JavaScript, you can improve performance by writing clean, efficient code. Here are some recommendations to ensure your code runs efficiently: - Use well-established libraries like lodash for common operations, as they are optimized and tested by the community. See [how to use external JS libraries](/core-concepts/writing-code/ext-libraries). @@ -42,7 +42,7 @@ Appsmith’s key-value store serves as a wrapper around JavaScript’s local sto
-Example: Instead of calling `storeValue()` multiple times in a loop: +*Example:* Instead of calling `storeValue()` multiple times in a loop: ```js for (let i = 0; i < 100; i++) { @@ -62,7 +62,7 @@ storeValue("batchData", valuesToStore); // Store all values at once ```
-* **Leverage JS Object Mutations**: If you’re keeping data purely on the client side and do not need to pass it to the server, consider using JSObject variable [mutation](/write-code/best-practices#use-mutable-js-variables). This approach can offer better performance than using `storeValue()`. +* **Leverage JS Object Mutations**: If you're storing data only on the client side and don't need to send it to the server, consider mutating JSObject variables [mutation](/write-code/best-practices#use-mutable-js-variables). This can perform better than using `storeValue()`.
@@ -113,7 +113,7 @@ You can configure queries and JavaScript functions to run automatically when a p
-* Implement Lazy Loading by fetching only essential data initially, and loading additional data as needed, such as triggering queries on button clicks. See [Trigger UI Actions](/core-concepts/writing-code/ui-actions). +* Implement lazy loading by fetching only essential data initially, and loading additional data as needed, such as triggering queries on button clicks. See [Trigger UI Actions](/core-concepts/writing-code/ui-actions). @@ -129,9 +129,7 @@ To improve application performance, especially for users with less powerful devi ## Optimizing the server side of your app -The server side of your app handles all backend operations, including data processing, database interactions, and API requests. Optimizing the server side is crucial for reducing response times, improving scalability, and ensuring a smooth user experience, especially under high load. - -To enhance server performance, it’s important to focus on efficient resource management, robust error handling, and minimizing unnecessary operations. The following sections outline best practices you can follow to optimize the server side of your application. +The server side of your app handles all backend operations, including data processing, database interactions, and API requests. Optimizing the server side is crucial for reducing response times, improving scalability, and ensuring a smooth user experience, especially under high load. The following sections outline best practices you can follow to optimize the server side of your application. ### Profile server calls From 60d6846557c4ea9391b6341c7e5ce897e930998d Mon Sep 17 00:00:00 2001 From: harshilp24 Date: Fri, 27 Sep 2024 08:32:32 +0530 Subject: [PATCH 6/7] .. --- website/docs/build-apps/performance-best-practices.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/build-apps/performance-best-practices.md b/website/docs/build-apps/performance-best-practices.md index 61c5e906db..6922b1e1cd 100644 --- a/website/docs/build-apps/performance-best-practices.md +++ b/website/docs/build-apps/performance-best-practices.md @@ -62,7 +62,7 @@ storeValue("batchData", valuesToStore); // Store all values at once ``` -* **Leverage JS Object Mutations**: If you're storing data only on the client side and don't need to send it to the server, consider mutating JSObject variables [mutation](/write-code/best-practices#use-mutable-js-variables). This can perform better than using `storeValue()`. +* **Leverage JS Object Mutations**: If you're storing data only on the client side and don't need to send it to the server, consider mutating JSObject variables [mutation](/write-code/best-practices#use-mutable-js-variables). JS Object mutation means directly changing the properties of an object without creating a new one. This can perform better than using `storeValue()`.
From 7d90f3e6796cfcb469657a0d49a3901a2598ff26 Mon Sep 17 00:00:00 2001 From: harshilp24 Date: Fri, 27 Sep 2024 08:33:25 +0530 Subject: [PATCH 7/7] .. --- website/docs/build-apps/performance-best-practices.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/build-apps/performance-best-practices.md b/website/docs/build-apps/performance-best-practices.md index 6922b1e1cd..022b7b6ab6 100644 --- a/website/docs/build-apps/performance-best-practices.md +++ b/website/docs/build-apps/performance-best-practices.md @@ -1,6 +1,6 @@ # Performance Best Practices -This page provides essential performance best practices to help you optimize your Appsmith applications, covering both client-side and server-side improvements to ensure a smooth and efficient user experience. +This page provides performance best practices to help you optimize your Appsmith applications, covering both client-side and server-side improvements to ensure a smooth and efficient user experience. ## Optimizing the client side of your app