First, make sure you've allocated sufficient memory (see Allocating Memory).
If you're using an AMD graphics card, one of the best performance improvements you'll get is by adjusting the mipmap settings. In some cases people have reported getting 2000%-3000% better frame rates from this one change alone.
In the video settings menu, slide the mipmap levels slider from 4 to 0.
This change does have some performance improvements for nVidia users as well, but the improvements are smaller.
Please see the Server Setup guide for Troubleshooting Lag. The same tips also apply to a single-player world. Both the built-in debug profiler provided by Mojang and the Spark mod can help you track down sources of lag in your world.
The number one most common cause of low TPS is mob AI, and the most common cause of that is caves full of zombies holding items. Zombies that have an item in their hand don't count towards the mob cap and don't despawn, so can often pile-up underground without a player noticing.
The next most common cause is a high number of chunks loaded. This can be caused by chunk loaders, a high number of players being online (if in multi-player), or a high render-distance.
Some (but not all) users will see performance benefits from installing OptiFine (see the OptiFine guide here). In general, we've found that OptiFine reduces CPU usage but increases RAM usage and pack loading times.
Our packs already include the performance mods that we consider to be stable enough for most users (excluding OptiFine, which we can't include alongside the pack due to their licensing / copyright). However, there are some mods around that can aid with performance in some situations.
For all packs, the Dynamic View mod may help if you are running a server. It is only needed server-side, your players do not also need the mod. Dynamic View causes the number of chunks around each player to expand or shrink depending on the current load on the server, so if a server is lagging it will load fewer chunks and if it is running well it will load more.
For our 1.15.2 packs, you might consider using the Forge version of Lithium, but please use caution - it is entirely unsupported, and may require adjusting the config of Performant to prevent incompatible overlap. Lithium can be used on a server without the players also having the mod. It does give performance gains in some cases, but please make a backup of your world first.
You should only adjust these if you are familiar with JVM arguments and Minecraft mod packs. These parameters improve the way Java handles memory (specifically garbage collection) and are selected with Minecraft specifically in mind. Note that these arguments do not include the Xms and Xms settings, which are usually included by the launcher you are using, but not always. You may need to add those as well.
-XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M
These were obtained from the excellent Reddit post by CPW here: CPW's Reddit Post on Minecraft Memory Usage.
You may find that different JVM arguments work better or worse for you. This post was also made quite some time ago and there may be better options available. Feel free to suggest changes on our Discord server if you find some that work particularly well for you. Include your system specs if doing so.