在本文中,我们将给您介绍关于Golang上每次全局数据库连接和打开连接之间的性能差异的详细内容,并且为您解答golang数据库连接池的相关问题,此外,我们还将为您提供关于Android和iOS上的SQ
在本文中,我们将给您介绍关于Golang上每次全局数据库连接和打开连接之间的性能差异的详细内容,并且为您解答golang 数据库连接池的相关问题,此外,我们还将为您提供关于Android和iOS上的SQLite之间的性能差异、angularjs / rendering内联或使用ng-include之间的性能差异、c# – VALA与AOT编译之间的性能差异?、C++ 框架中不同内存分配器之间的性能差异分析的知识。
本文目录一览:- Golang上每次全局数据库连接和打开连接之间的性能差异(golang 数据库连接池)
- Android和iOS上的SQLite之间的性能差异
- angularjs / rendering内联或使用ng-include之间的性能差异
- c# – VALA与AOT编译之间的性能差异?
- C++ 框架中不同内存分配器之间的性能差异分析
Golang上每次全局数据库连接和打开连接之间的性能差异(golang 数据库连接池)
在我当前的项目中,每次用户发出请求时,我都会打开一个新的数据库连接。例如:
func login(w http.ResponseWriter, r *http.Request) {...db, err := sqlx.Connect("postgres", "user=postgres password=*** dbname=postgres")if err != nil { ErrorWithJSON(w, err.Error(), http.StatusBadRequest) return}db.SetMaxIdleConns(0)db.SetConnMaxLifetime(time.Second * 30)user, err := loginManager(db, m)...err = db.Close()}
当我搜索其他人的代码时,我发现大多数开发人员都会为数据库连接创建一个全局变量,在全局变量上进行设置,然后在整个项目中使用该变量。
我想知道这些方法之间有什么区别吗?如果我使用全局变量,那么当5个不同的用户进行注册/登录等请求时,会有任何延迟。如果会有延迟,我是否应该创建多个数据库连接并将它们存储在一个切片中以供将来使用,以便我可以在用户使用时随机选择提出要求。就像一个简单的负载均衡器一样,我不知道吗?
抱歉,有多个问题。谢谢!
答案1
小编典典是的,可能会有巨大的性能差异(取决于您运行的查询的性质以及系统和服务器配置,可能有几个数量级)。
该sqlx.DB
类型包装(嵌入)一个sql.DB
类型,该类型管理连接池:
DB是代表零个或多个基础连接池的数据库句柄。对于多个goroutine并发使用是安全的。
sql软件包会自动创建并释放连接。它还维护空闲连接的空闲池。如果数据库具有每个连接状态的概念,则只能在事务中可靠地观察到这种状态。
每次打开新连接时,“背景”中都会发生很多事情:必须解析连接字符串,必须建立TCP连接,必须执行身份验证/授权,必须在两侧分配资源(客户端和服务器)等。这些只是主要的,显而易见的内容。即使可以优化/缓存来提供/实现其中一些功能,但是与拥有一个DB
实例(可能在池中准备好多个已建立的经过身份验证的连接,等待使用/利用)的单个实例相比,仍然存在大量开销。
也引用自sql.Open()
:
返回的数据库可安全地供多个goroutine并发使用,并维护其自己的空闲连接池。 因此,Open函数应仅被调用一次。 很少需要关闭数据库。
sqlx.Connect()
您使用的电话sqlx.Open()
是
“同sql.Open,但返回的* sqlx.DB代替” 。
因此,总而言之,请使用一个全局sqlx.DB
或sql.DB
实例,并在任何地方共享/使用它。它为您提供自动连接和连接池管理。这将为您提供最佳性能。您可以微调与连接池DB.SetConnMaxLifetime()
,DB.SetMaxIdleConns()
和DB.SetMaxOpenConns()
方法。
空闲连接(DB.SetMaxIdleConns()
)是当前未使用但坐在游泳池中,等待有人将其捡起的那些连接。您绝对应该拥有其中的一些,例如5或10,甚至更多。DB.SetConnMaxLifetime()
控制使用新连接的时间。一旦它变老了,它将被关闭(如果需要,将打开一个新的)。您不应该更改此设置,默认行为是永不终止连接。基本上所有默认设置都是明智的,只有在遇到性能问题时才应使用它们。另外,请阅读这些方法的文档以清楚了解。
Android和iOS上的SQLite之间的性能差异
我试图在Android和iOS中为项目执行sqlite性能之间的基准测试,并且与Android相比,iOS平台上的性能似乎非常糟糕.
我想要实现的是测量将多个行(5000)插入sqlite DB并在平台之间进行比较的时间.对于Android,我得到大约500ms的结果来执行所有5000次插入,但对于iOS,相同的操作需要20秒以上.怎么会这样?
这是我的iOS代码片段(插入部分),dataArray是一个包含5000个随机100个字符Nsstrings的数组:
int numEntries = 5000;
self.dataArray = [[NSMutableArray alloc] initWithCapacity:numEntries];//Array for random data to write to database
//generate random data (100 char strings)
for (int i=0; i<numEntries; i++) {
[self.dataArray addobject:[self genRandStringLength:100]];
}
// Get the documents directory
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
Nsstring *docsDir = [dirPaths objectAtIndex:0];
// Build the path to the database file
Nsstring *databasePath = [[Nsstring alloc] initWithString:[docsDir stringByAppendingPathComponent: @"benchmark.db"]];
Nsstring *resultHolder = @"";
//Try to open DB, if file not present, create it
if (sqlite3_open([databasePath UTF8String], &db) == sqlITE_OK){
sql = @"CREATE TABLE IF NOT EXISTS BENCHMARK(ID INTEGER PRIMARY KEY AUTOINCREMENT, TESTCOLUMN TEXT)";
//Create table
if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, NULL) == sqlITE_OK){
NSLog(@"DB created");
}else{
NSLog(@"Failed to create DB");
}
//START: INSERT BENCHMARK
NSDate *startTime = [[NSDate alloc] init];//Get timestamp for insert-timer
//Insert values in DB, one by one
for (int i = 0; i<numEntries; i++) {
sql = [Nsstring stringWithFormat:@"INSERT INTO BENCHMARK (TESTCOLUMN) VALUES('%@')",[self.dataArray objectAtIndex:i]];
if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, NULL) == sqlITE_OK){
//Insert successful
}
}
//Append time consumption to display string
resultHolder = [resultHolder stringByAppendingString:[Nsstring stringWithFormat:@"5000 insert ops took %f sec\n", [startTime timeIntervalSinceNow]]];
//END: INSERT BENCHMARK
Android代码段:
// SETUP
long startTime, finishTime;
// Get database object
BenchmarkOpenHelper databaseHelper = new BenchmarkOpenHelper(getApplicationContext());
sqliteDatabase database = databaseHelper.getWritableDatabase();
// Generate array containing random data
int rows = 5000;
String[] rowData = new String[rows];
int dataLength = 100;
for (int i=0; i<rows; i++) {
rowData[i] = generaterandomString(dataLength);
}
// FirsT TEST: Insertion
startTime = System.currentTimeMillis();
for(int i=0; i<rows; i++) {
database.rawQuery("INSERT INTO BENCHMARK (TESTCOLUMN) VALUES(?)", new String[] {rowData[i]});
}
finishTime = System.currentTimeMillis();
result += "Insertion test took: " + String.valueOf(finishTime-startTime) + "ms \n";
// END FirsT TEST
解决方法:
您需要使用事务 – 首先执行BEGIN并使用COMMIT结束.
这应该会大大提高INSERT的性能.
http://www.titaniumdevelopment.com.au/blog/2012/01/27/10x-faster-inserts-in-sqlite-using-begin-commit-in-appcelerator-titanium-mobile/
一旦完成,我预计在两个平台上都会有5000个插件非常快.
这是另一个StackOverflow答案,其中列出了大量可以提高sqlite性能的不同内容,包括使用绑定变量和启用各种PRAGMA模式,这些模式可以提高速度的稳健性:Improve INSERT-per-second performance of SQLite?
angularjs / rendering内联或使用ng-include之间的性能差异
这是否有效.使用角度包含时对性能的影响是什么
我能看到的唯一真正的区别是ng-include将包含/异步渲染你的部分,所以你可能会看到一些延迟,特别是当通过网络获取部分时(但这可以通过预加载部分来减轻,如此处所述) :https://stackoverflow.com/a/12346901/1418796)
简而言之:在大多数情况下,如果预先加载部分,则ng-include的影响应该可以忽略不计.
最后一条评论:“过早优化是所有邪恶的根源”.在测量应用程序的性能并确定ng-include是瓶颈之前,请不要启动微观性能调整.
c# – VALA与AOT编译之间的性能差异?
背景(我知道的):
> VALA转换为C代码,然后将其编译为本地机器代码.
> AOT(Java / Mono C#)也可以生成本地机器代码(而不是使用VM,但仍然需要运行时包).
>在某些情况下使用虚拟机,可以比本地机器代码更快(因为它可以通过JIT编译器进行优化).
>消耗品C/C++库可以使用VALA生产.
有一些事情在我的头上,我找不到答案:
>可以使用AOT编译器生产C/C++耗材库? (我猜不会).
>生成的AOT二进制文件是否仍然具有桥接性能问题? (我猜是这样).
>在VALA中调用C/C++库与C中调用它们的性能相同? (我猜是这样).
任何洞察力
解决方法
这不可能,因为我们没有标题,它不是严格的C类AOT编译器正在创建,而只是机器代码.
(旁注:java类可以是called inside C/C++,但是由于AOT编译器生成一个二进制文件,我相信您无法从该文件外部访问java类).
答:不
2.生成的AOT二进制文件是否还具有桥接性能问题?
首先,我们需要知道:如果使用桥(如JNI,javacpp等)从Java调用任何C/C++类将总是导致性能下降?
根据##java@irc.freenode.net的“W_”:
it depends on how you’re calling it (e.g. if arguments have to be
converted and such).
Just calling out to a library function without any arguments or return
type conversion shouldn’t take any different time than it does in any
C app.
但是当我使用JavaCV作为OpenCV库的桥接器时,它使用几种类型的对象,如果上述是对的,它将影响性能.
因此,可能合乎逻辑的是,AOT编译可能会加快一点执行速度,但仍然需要经过桥接器并进行类型转换.
答:是(但可能稍快)
调用VALA中的C/C++库具有与C调用相同的性能?
当它直接转换为C时,我看不到没有理由.这得到#vala@irc.gimp.org的“nemequ”的支持:
pretty much,yes. vala has a habit of using temporary variables,but
that’s exactly the sort of thing most compilers can easily optimize
away. if you’re using gcc,pass -O2 and you should be good.
答:是的
仍然我不知道为什么“有人”投票结束我的问题,他/她甚至没有打扰评论.
我认为这些问题/答案是足够建设性的(如pst评论),它们可能对其他对VALA或AOT编译器来说很新的人是有帮助的.
如果我的结论不正确,请纠正我.
C++ 框架中不同内存分配器之间的性能差异分析
不同
C++ 框架中不同内存分配器之间的性能差异分析
引言
内存分配器是 C++ 框架中的关键组件,负责管理程序内存。不同的分配器实现具有不同的性能特征,根据应用程序的要求对它们进行基准测试对于优化性能至关重要。
立即学习“C++免费学习笔记(深入)”;
常见的内存分配器
- 系统 malloc()/realloc():由系统提供的标准分配器。可靠且易于使用,但性能可能受系统开销的影响。
- jemalloc:高性能分配器,通过并行性和优化算法提高吞吐量和减少延迟。
- tcmalloc:谷歌开发的分配器,专为大规模系统和高并发性而设计。
基准测试用例
我们使用了一个基准测试应用程序来比较分配器的性能。应用程序分配和释放了许多不同大小的对象,同时测量分配时间和碎片率。
结果
分配时间:
- jemalloc 在所有对象大小下都比 malloc() 和 tcmalloc 显著更快。
- tcmalloc 比 malloc() 快,在大对象分配方面特别明显。
碎片率:
- jemalloc 的碎片率始终低于 malloc() 和 tcmalloc。
- tcmalloc 的碎片率在较小对象大小下高于 malloc(),但在较大对象大小下低于 malloc()。
实战案例
我们在一个实际的 Web 应用程序中部署了 jemalloc。与 malloc() 相比,应用程序的吞吐量提高了 20%,延迟减少了 15%。
结论
不同的内存分配器在性能方面存在显着差异。对于要求高吞吐量和低延迟的应用程序,jemalloc 是一个很好的选择。对于较大的应用程序和小对象分配,tcmalloc 也是一个不错的选择。通过对分配器进行基准测试,开发人员可以根据应用程序的具体需求做出明智的决策。
以上就是C++ 框架中不同内存分配器之间的性能差异分析的详细内容,更多请关注php中文网其它相关文章!
今天关于Golang上每次全局数据库连接和打开连接之间的性能差异和golang 数据库连接池的介绍到此结束,谢谢您的阅读,有关Android和iOS上的SQLite之间的性能差异、angularjs / rendering内联或使用ng-include之间的性能差异、c# – VALA与AOT编译之间的性能差异?、C++ 框架中不同内存分配器之间的性能差异分析等更多相关知识的信息可以在本站进行查询。
本文标签: