C#高级:程序查询写法性能优化提升策略(附带Gzip算法示例)

一、基本要求

bash 复制代码
1.按需查询,不要的字段不查
2.缓存优先,内存比磁盘读写快(Redis也不要放太多的数据,按需存储,不然读写也慢)
3.线程并行,最后await输出所有结果
4.批量优先,插入或更新使用数据库批量操作
5.压缩算法,传输大量重复文本,避免网络大开销
6.耗时长操作推入消息队列,慢慢消费
7.循环内部短流程,不要for循环里面写耗时操作例如查库、读写文件
8.非必要不递归
9.非必要不加锁(尽量不要修改静态字段,尽量用实例字段)

二、Gzip算法

cs 复制代码
public class Program
{
    /*
        简介:Gzip是一种基于DEFLATE算法的无损数据压缩算法,广泛应用于文件压缩和网络数据传输。
        算法:DEFLATE 算法 =  LZ77字典编码 + 霍夫曼编码
        适用场景:大量重复内容文本、长文本
     */


    /// <summary>
    /// 压缩
    /// </summary>
    public static string CompressString(string text)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(text);
        byte[] compressedData = null;
        using (var memoryStream = new MemoryStream())
        {
            using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
            {
                gZipStream.Write(buffer, 0, buffer.Length);
            }

            memoryStream.Position = 0;

            compressedData = new byte[memoryStream.Length];
            memoryStream.Read(compressedData, 0, compressedData.Length);
        }
        var gZipBuffer = new byte[compressedData.Length + 4];
        Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length);
        Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
        return Convert.ToBase64String(gZipBuffer);
    }

    /// <summary>
    /// 解压
    /// </summary>
    public static string DecompressString(string compressedText)
    {
        byte[] gZipBuffer = Convert.FromBase64String(compressedText);
        using (var memoryStream = new MemoryStream())
        {
            int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
            memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);

            var buffer = new byte[dataLength];

            memoryStream.Position = 0;
            using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
            {
                gZipStream.Read(buffer, 0, buffer.Length);
            }

            return Encoding.UTF8.GetString(buffer);
        }
    }

    static async Task Main(string[] args)
    {
        // 测试1:高度重复的文本
        var repetitiveText = new string('A', 1000) + new string('B', 1000) + new string('C', 1000);
        Console.WriteLine($"重复文本原始长度: {repetitiveText.Length}");
        var compressed1 = CompressString(repetitiveText);
        Console.WriteLine($"重复文本压缩后: {compressed1.Length}");
        Console.WriteLine($"压缩比: {(double)compressed1.Length / repetitiveText.Length:P}");

        // 测试2:你的原始文本
        var originalText = ""ConsoleApp1.exe"(CoreCLR: clrhost): 已加载...";
        Console.WriteLine($"\n原始文本长度: {originalText.Length}");
        var compressed2 = CompressString(originalText);
        Console.WriteLine($"原始文本压缩后: {compressed2.Length}");
        Console.WriteLine($"压缩比: {(double)compressed2.Length / originalText.Length:P}");

        // 测试3:JSON数据(通常压缩效果好)
        var jsonText = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}".Repeat(50);
        Console.WriteLine($"\nJSON文本长度: {jsonText.Length}");
        var compressed3 = CompressString(jsonText);
        Console.WriteLine($"JSON文本压缩后: {compressed3.Length}");
        Console.WriteLine($"压缩比: {(double)compressed3.Length / jsonText.Length:P}");
    }
}

三、相关技巧

C#高级:提升数据库查询效率的优化策略与方法_c# 分表查询-CSDN博客

相关推荐
SuperEugene1 分钟前
前端 utils 工具函数规范:拆分 / 命名 / 复用全指南,避开全局污染等高频坑|编码语法规范篇
开发语言·前端·javascript
祝大家百事可乐1 分钟前
嵌入式——02 数据结构
c++·c#·硬件工程
A923A7 分钟前
【洛谷刷题 | 第四天】
算法·前缀和·贪心·洛谷·差分
古城小栈9 分钟前
Go 底层代码的完整分类
开发语言·后端·golang
耳冉鹅14 分钟前
Go无锁共享内存环形缓冲区设计
开发语言·golang
bai_lan_ya19 分钟前
使用linux的io文件操作综合实验_处理表格
linux·服务器·算法
计算机安禾23 分钟前
【C语言程序设计】第36篇:二进制文件的读写
c语言·开发语言·c++·算法·github·visual studio code·visual studio
ZPC821025 分钟前
OLOv11 + 深度相机的方案实现高精度3D定位
人工智能·数码相机·算法·机器人
子非鱼@Itfuture25 分钟前
try-catch和try-with-resources区别是什么?try{}catch(){}和try(){}catch(){}有什么好处?
java·开发语言
_日拱一卒29 分钟前
LeetCode:字母异位词分组
算法·leetcode·职场和发展