从文件中读取图片,与从数据库表中读取图片评测

一、在 d:\ 下创建 image 文件夹,再放10 张图片, 名称从 1.png 到 10.png .

二、先创建新库 db1, 然后按下面脚本创建初始环境:

USE db1
GO
IF OBJECT_ID('t_path') IS NOT NULL DROP TABLE t_path
GO
CREATE TABLE t_path(
	id INT IDENTITY(1,1) PRIMARY KEY,
	uname NVARCHAR(20) NOT NULL,
	imgPath VARCHAR(50)	 NOT NULL
)
GO
IF OBJECT_ID('t_img') IS NOT NULL DROP TABLE t_img
GO
CREATE TABLE t_img(
	id INT IDENTITY(1,1) PRIMARY KEY,
	uname NVARCHAR(20)  NOT NULL,
	img VARBINARY(MAX)   NULL
)
GO
INSERT INTO t_path(uname,imgPath)
SELECT 'a'+LTRIM(sv.number),'d:\image\'+LTRIM(sv.number)+'.png' 
FROM [master].dbo.spt_values AS sv WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND 10

INSERT INTO t_img(uname)
SELECT 'a'+LTRIM(sv.number) 
FROM [master].dbo.spt_values AS sv WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND 10

三、测试两者的读取速度:

注:第一次要更新图片,后面再注释掉: UpdateImg();

using System;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;

namespace ConsoleApp4
{
    class Program
    {
        //如果使用 tempdb ,则两者差别不大
        //如果不用异步,则放前面的慢,后面的快
        static readonly string ConnString = "data source=(local)\\sqlserver2014;initial catalog=db1;Integrated Security=True";
        static void Main(string[] args)
        {
            //UpdateImg();
            Task.Run(() =>
            {
                ReadImgByteByFile();
            });

            Task.Run(() =>
            {
                ReadImgByteByDB();
            });

            Console.Read();
        }

        static void UpdateImg()
        {
            byte[] byteArr = File.ReadAllBytes("d:\\image\\1.png");
            using(SqlConnection conn = new SqlConnection(ConnString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("update t_img set img=@img", conn);
                cmd.Parameters.AddWithValue("@img", byteArr);
                cmd.ExecuteNonQuery();
            }
        }

        static void ReadImgByteByFile()
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();

            for (int i = 1; i <= 10; i++)
            {
                using (SqlConnection conn = new SqlConnection(ConnString))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand("select imgPath from t_path where id=@id", conn);
                    cmd.Parameters.AddWithValue("@id", i);
                    string path = cmd.ExecuteScalar().ToString();
                    byte[] arr = File.ReadAllBytes(path);
                }
            }
            Console.WriteLine("ReadImgByteByFile: {0} ms", sw.ElapsedMilliseconds);
        }

        static void ReadImgByteByDB()
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();

            for (int i = 1; i <= 10; i++)
            {
                using (SqlConnection conn = new SqlConnection(ConnString))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand("select img from t_img where id=@id", conn);
                    cmd.Parameters.AddWithValue("@id", i);
                    byte[] arr =(byte[]) cmd.ExecuteScalar();
                }
            }
            Console.WriteLine("ReadImgByteByDB: {0} ms", sw.ElapsedMilliseconds);
        }
    }
}

 

两者的大小比较:

File+Table:  5.39 + 0.008=5.398 MB

Table( varbinary ): 5.578 MB

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值