fasthttp

fasthttp

Go语言高性能HTTP库 专为高并发请求优化

fasthttp是Go语言的高性能HTTP库,专为处理每秒数千个请求而优化。它提供低毫秒级响应时间,在高并发场景下性能可达net/http的10倍。fasthttp支持大量并发连接,已在生产环境验证,适用于追求极致性能的Web服务。但对于一般应用,net/http通常更易用且足够快。

fasthttp性能HTTPGo服务器Github开源项目

fasthttp GoDoc Go Report

FastHTTP – Go语言中最快速可靠的HTTP实现

Go语言的快速HTTP实现。

fasthttp可能并不适合你!

fasthttp是为某些高性能边缘场景设计的。除非你的服务器/客户端需要每秒处理数千个小型到中型请求,并且需要保持一致的低毫秒级响应时间,否则fasthttp可能并不适合你。对于大多数情况,net/http要好得多,因为它更易于使用且能处理更多场景。在大多数情况下,你甚至不会注意到性能差异。

基本信息和链接

目前,VertaMedia在生产环境中成功使用fasthttp,每台物理服务器可处理超过150万个并发保持连接,提供高达每秒20万次的请求处理能力。

TechEmpower基准测试第19轮结果

服务器基准测试

客户端基准测试

安装

文档

文档中的示例

代码示例

优秀的fasthttp工具

从net/http切换到fasthttp

Fasthttp最佳实践

字节缓冲区技巧

相关项目

常见问题

net/http的HTTP服务器性能比较

简而言之,fasthttp服务器的速度比net/http快至多10倍。 以下是基准测试结果。

GOMAXPROCS=1

net/http服务器:

$ GOMAXPROCS=1 go test -bench=NetHTTPServerGet -benchmem -benchtime=10s
BenchmarkNetHTTPServerGet1ReqPerConn                	 1000000	     12052 ns/op	    2297 B/op	      29 allocs/op
BenchmarkNetHTTPServerGet2ReqPerConn                	 1000000	     12278 ns/op	    2327 B/op	      24 allocs/op
BenchmarkNetHTTPServerGet10ReqPerConn               	 2000000	      8903 ns/op	    2112 B/op	      19 allocs/op
BenchmarkNetHTTPServerGet10KReqPerConn              	 2000000	      8451 ns/op	    2058 B/op	      18 allocs/op
BenchmarkNetHTTPServerGet1ReqPerConn10KClients      	  500000	     26733 ns/op	    3229 B/op	      29 allocs/op
BenchmarkNetHTTPServerGet2ReqPerConn10KClients      	 1000000	     23351 ns/op	    3211 B/op	      24 allocs/op
BenchmarkNetHTTPServerGet10ReqPerConn10KClients     	 1000000	     13390 ns/op	    2483 B/op	      19 allocs/op
BenchmarkNetHTTPServerGet100ReqPerConn10KClients    	 1000000	     13484 ns/op	    2171 B/op	      18 allocs/op

fasthttp服务器:

$ GOMAXPROCS=1 go test -bench=kServerGet -benchmem -benchtime=10s
BenchmarkServerGet1ReqPerConn                       	10000000	      1559 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet2ReqPerConn                       	10000000	      1248 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet10ReqPerConn                      	20000000	       797 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet10KReqPerConn                     	20000000	       716 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet1ReqPerConn10KClients             	10000000	      1974 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet2ReqPerConn10KClients             	10000000	      1352 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet10ReqPerConn10KClients            	20000000	       789 ns/op	       2 B/op	       0 allocs/op
BenchmarkServerGet100ReqPerConn10KClients           	20000000	       604 ns/op	       0 B/op	       0 allocs/op

GOMAXPROCS=4

net/http服务器:

$ GOMAXPROCS=4 go test -bench=NetHTTPServerGet -benchmem -benchtime=10s
BenchmarkNetHTTPServerGet1ReqPerConn-4                  	 3000000	      4529 ns/op	    2389 B/op	      29 allocs/op
BenchmarkNetHTTPServerGet2ReqPerConn-4                  	 5000000	      3896 ns/op	    2418 B/op	      24 allocs/op
BenchmarkNetHTTPServerGet10ReqPerConn-4                 	 5000000	      3145 ns/op	    2160 B/op	      19 allocs/op
BenchmarkNetHTTPServerGet10KReqPerConn-4                	 5000000	      3054 ns/op	    2065 B/op	      18 allocs/op
BenchmarkNetHTTPServerGet1ReqPerConn10KClients-4        	 1000000	     10321 ns/op	    3710 B/op	      30 allocs/op
BenchmarkNetHTTPServerGet2ReqPerConn10KClients-4        	 2000000	      7556 ns/op	    3296 B/op	      24 allocs/op
BenchmarkNetHTTPServerGet10ReqPerConn10KClients-4       	 5000000	      3905 ns/op	    2349 B/op	      19 allocs/op
BenchmarkNetHTTPServerGet100ReqPerConn10KClients-4      	 5000000	      3435 ns/op	    2130 B/op	      18 allocs/op

fasthttp服务器:

$ GOMAXPROCS=4 go test -bench=kServerGet -benchmem -benchtime=10s
BenchmarkServerGet1ReqPerConn-4                         	10000000	      1141 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet2ReqPerConn-4                         	20000000	       707 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet10ReqPerConn-4                        	30000000	       341 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet10KReqPerConn-4                       	50000000	       310 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet1ReqPerConn10KClients-4               	10000000	      1119 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet2ReqPerConn10KClients-4               	20000000	       644 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet10ReqPerConn10KClients-4              	30000000	       346 ns/op	       0 B/op	       0 allocs/op
BenchmarkServerGet100ReqPerConn10KClients-4             	50000000	       282 ns/op	       0 B/op	       0 allocs/op

与net/http的HTTP客户端比较

简而言之,fasthttp客户端的速度比net/http快至多10倍。 以下是基准测试结果。

GOMAXPROCS=1 net/http 客户端:

$ GOMAXPROCS=1 go test -bench='HTTPClient(Do|GetEndToEnd)' -benchmem -benchtime=10s
BenchmarkNetHTTPClientDoFastServer                  	 1000000	     12567 ns/op	    2616 B/op	      35 allocs/op
BenchmarkNetHTTPClientGetEndToEnd1TCP               	  200000	     67030 ns/op	    5028 B/op	      56 allocs/op
BenchmarkNetHTTPClientGetEndToEnd10TCP              	  300000	     51098 ns/op	    5031 B/op	      56 allocs/op
BenchmarkNetHTTPClientGetEndToEnd100TCP             	  300000	     45096 ns/op	    5026 B/op	      55 allocs/op
BenchmarkNetHTTPClientGetEndToEnd1Inmemory          	  500000	     24779 ns/op	    5035 B/op	      57 allocs/op
BenchmarkNetHTTPClientGetEndToEnd10Inmemory         	 1000000	     26425 ns/op	    5035 B/op	      57 allocs/op
BenchmarkNetHTTPClientGetEndToEnd100Inmemory        	  500000	     28515 ns/op	    5045 B/op	      57 allocs/op
BenchmarkNetHTTPClientGetEndToEnd1000Inmemory       	  500000	     39511 ns/op	    5096 B/op	      56 allocs/op

fasthttp 客户端:

$ GOMAXPROCS=1 go test -bench='kClient(Do|GetEndToEnd)' -benchmem -benchtime=10s
BenchmarkClientDoFastServer                         	20000000	       865 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd1TCP                      	 1000000	     18711 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd10TCP                     	 1000000	     14664 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd100TCP                    	 1000000	     14043 ns/op	       1 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd1Inmemory                 	 5000000	      3965 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd10Inmemory                	 3000000	      4060 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd100Inmemory               	 5000000	      3396 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd1000Inmemory              	 5000000	      3306 ns/op	       2 B/op	       0 allocs/op

GOMAXPROCS=4

net/http 客户端:

$ GOMAXPROCS=4 go test -bench='HTTPClient(Do|GetEndToEnd)' -benchmem -benchtime=10s
BenchmarkNetHTTPClientDoFastServer-4                    	 2000000	      8774 ns/op	    2619 B/op	      35 allocs/op
BenchmarkNetHTTPClientGetEndToEnd1TCP-4                 	  500000	     22951 ns/op	    5047 B/op	      56 allocs/op
BenchmarkNetHTTPClientGetEndToEnd10TCP-4                	 1000000	     19182 ns/op	    5037 B/op	      55 allocs/op
BenchmarkNetHTTPClientGetEndToEnd100TCP-4               	 1000000	     16535 ns/op	    5031 B/op	      55 allocs/op
BenchmarkNetHTTPClientGetEndToEnd1Inmemory-4            	 1000000	     14495 ns/op	    5038 B/op	      56 allocs/op
BenchmarkNetHTTPClientGetEndToEnd10Inmemory-4           	 1000000	     10237 ns/op	    5034 B/op	      56 allocs/op
BenchmarkNetHTTPClientGetEndToEnd100Inmemory-4          	 1000000	     10125 ns/op	    5045 B/op	      56 allocs/op
BenchmarkNetHTTPClientGetEndToEnd1000Inmemory-4         	 1000000	     11132 ns/op	    5136 B/op	      56 allocs/op

fasthttp 客户端:

$ GOMAXPROCS=4 go test -bench='kClient(Do|GetEndToEnd)' -benchmem -benchtime=10s
BenchmarkClientDoFastServer-4                           	50000000	       397 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd1TCP-4                        	 2000000	      7388 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd10TCP-4                       	 2000000	      6689 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd100TCP-4                      	 3000000	      4927 ns/op	       1 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd1Inmemory-4                   	10000000	      1604 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd10Inmemory-4                  	10000000	      1458 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd100Inmemory-4                 	10000000	      1329 ns/op	       0 B/op	       0 allocs/op
BenchmarkClientGetEndToEnd1000Inmemory-4                	10000000	      1316 ns/op	       5 B/op	       0 allocs/op

安装

go get -u github.com/valyala/fasthttp

从 net/http 切换到 fasthttp

遗憾的是,fasthttp 并未提供与 net/http 完全相同的 API。 详情请参阅 FAQ。 虽然有 net/http -> fasthttp 处理器转换器, 但为了充分利用 fasthttp 的所有优势(尤其是高性能),最好手动编写 fasthttp 请求处理器。

重要事项:

  • Fasthttp 使用 RequestHandler 函数 而不是实现 Handler 接口 的对象。 幸运的是,可以轻松地将绑定的结构体方法传递给 fasthttp:

    type MyHandler struct { foobar string } // net/http 风格的请求处理器,即绑定到 MyHandler 结构体的方法。 func (h *MyHandler) HandleFastHTTP(ctx *fasthttp.RequestCtx) { // 注意,我们可以在这里访问 MyHandler 的属性 - 见 h.foobar。 fmt.Fprintf(ctx, "Hello, world! Requested path is %q. Foobar is %q", ctx.Path(), h.foobar) } // fasthttp 风格的请求处理器,即普通函数。 func fastHTTPHandler(ctx *fasthttp.RequestCtx) { fmt.Fprintf(ctx, "Hi there! RequestURI is %q", ctx.RequestURI()) } // 将绑定的结构体方法传递给 fasthttp myHandler := &MyHandler{ foobar: "foobar", } fasthttp.ListenAndServe(":8080", myHandler.HandleFastHTTP) // 将普通函数传递给 fasthttp fasthttp.ListenAndServe(":8081", fastHTTPHandler)
  • RequestHandler 只接受一个参数 - RequestCtx。 它包含了处理 HTTP 请求和写入响应所需的所有功能。 下面是一个简单的请求处理器从 net/http 转换到 fasthttp 的例子。

    // net/http 请求处理器 requestHandler := func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/foo": fooHandler(w, r) case "/bar": barHandler(w, r) default: http.Error(w, "Unsupported path", http.StatusNotFound) } }
// 对应的 fasthttp 请求处理程序 requestHandler := func(ctx *fasthttp.RequestCtx) { switch string(ctx.Path()) { case "/foo": fooHandler(ctx) case "/bar": barHandler(ctx) default: ctx.Error("不支持的路径", fasthttp.StatusNotFound) } }
  • Fasthttp 允许以任意顺序设置响应头和写入响应体。不像 net/http 那样有"先头部,后主体"的限制。以下代码在 fasthttp 中是有效的:
requestHandler := func(ctx *fasthttp.RequestCtx) { // 首先设置一些头部和状态码 ctx.SetContentType("foo/bar") ctx.SetStatusCode(fasthttp.StatusOK) // 然后写入第一部分主体 fmt.Fprintf(ctx, "这是主体的第一部分\n") // 再设置更多头部 ctx.Response.Header.Set("Foo-Bar", "baz") // 继续写入更多主体 fmt.Fprintf(ctx, "这是主体的第二部分\n") // 然后覆盖已写入的主体 ctx.SetBody([]byte("这是完全新的主体内容")) // 再更新状态码 ctx.SetStatusCode(fasthttp.StatusNotFound) // 基本上,在 RequestHandler 返回之前, // 任何内容都可以多次更新。 // // 与 net/http 不同,fasthttp 直到 // RequestHandler 返回后才将响应发送到网络。 }
// net/http 代码 m := &http.ServeMux{} m.HandleFunc("/foo", fooHandlerFunc) m.HandleFunc("/bar", barHandlerFunc) m.Handle("/baz", bazHandler) http.ListenAndServe(":80", m)
// 对应的 fasthttp 代码 m := func(ctx *fasthttp.RequestCtx) { switch string(ctx.Path()) { case "/foo": fooHandlerFunc(ctx) case "/bar": barHandlerFunc(ctx) case "/baz": bazHandler.HandlerFunc(ctx) default: ctx.Error("未找到", fasthttp.StatusNotFound) } } fasthttp.ListenAndServe(":80", m)
  • 因为为每个请求创建一个新的通道代价太高,所以 RequestCtx.Done() 返回的通道只在服务器关闭时才会关闭。
func main() { fasthttp.ListenAndServe(":8080", fasthttp.TimeoutHandler(func(ctx *fasthttp.RequestCtx) { select { case <-ctx.Done(): // ctx.Done() 只在服务器关闭时才会关闭。 log.Println("上下文已取消") return case <-time.After(10 * time.Second): log.Println("处理成功完成") } }, time.Second*2, "超时")) }

使用这个出色的工具 - race detector - 来检测和消除程序中的数据竞争。如果在程序中检测到与 fasthttp 相关的数据竞争,那么很可能是因为您忘记在 RequestHandler 返回之前调用 TimeoutError

多核系统性能优化技巧

  • 使用 reuseport 监听器。
  • 为每个 CPU 核心运行一个单独的服务器实例,并设置 GOMAXPROCS=1。
  • 使用 taskset 将每个服务器实例固定到单独的 CPU 核心。
  • 确保多队列网卡的中断在 CPU 核心之间均匀分布。 详情请参阅这篇文章
  • 使用最新版本的 Go,因为每个版本都包含性能改进。

Fasthttp 最佳实践

  • 尽可能地重复使用对象和[]byte缓冲区,而不是重新分配。Fasthttp的API设计鼓励这种做法。
  • sync.Pool是你最好的朋友。
  • 在生产环境中分析你的程序go tool pprof --alloc_objects your-program mem.pprof通常比go tool pprof your-program cpu.pprof能提供更好的优化机会洞察。
  • 为热点路径编写测试和基准
  • 避免在[]bytestring之间进行转换,因为这可能导致内存分配和复制。Fasthttp API为[]bytestring都提供了函数 - 使用这些函数而不是手动在[]bytestring之间转换。有一些例外情况 - 更多细节请参见这个wiki页面
  • 定期在竞态检测器下验证你的测试和生产代码。
  • 在你的Web服务器中优先使用quicktemplate而不是html/template

[]byte缓冲区的技巧

以下技巧被fasthttp使用。在你的代码中也可以使用它们。

  • 标准Go函数接受nil缓冲区
var ( // 两个缓冲区都未初始化 dst []byte src []byte ) dst = append(dst, src...) // 如果dst为nil和/或src为nil也是合法的 copy(dst, src) // 如果dst为nil和/或src为nil也是合法的 (string(src) == "") // 如果src为nil则为true (len(src) == 0) // 如果src为nil则为true src = src[:0] // 对nil的src也能完美工作 // 即使src为nil,这个for循环也不会panic for i, ch := range src { doSomething(i, ch) }

所以从你的代码中删除对[]byte缓冲区的nil检查。例如,

srcLen := 0 if src != nil { srcLen = len(src) }

变成

srcLen := len(src)
  • 字符串可以用append追加到[]byte缓冲区
dst = append(dst, "foobar"...)
  • []byte缓冲区可以扩展到其容量
buf := make([]byte, 100) a := buf[:10] // len(a) == 10, cap(a) == 100. b := a[:100] // 有效,因为cap(a) == 100.
  • 所有fasthttp函数都接受nil []byte缓冲区
statusCode, body, err := fasthttp.Get(nil, "http://google.com/") uintBuf := fasthttp.AppendUint(nil, 1234)
  • 字符串和[]byte缓冲区可以无内存分配地转换
func b2s(b []byte) string { return *(*string)(unsafe.Pointer(&b)) } func s2b(s string) (b []byte) { bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) sh := (*reflect.StringHeader)(unsafe.Pointer(&s)) bh.Data = sh.Data bh.Cap = sh.Len bh.Len = sh.Len return b }

警告:

这是一种不安全的方法,结果字符串和[]byte缓冲区共享相同的字节。

请确保在字符串仍然存在时不要修改[]byte缓冲区中的字节!

相关项目

  • fasthttp - 基于fasthttp的项目的各种有用辅助工具。
  • fasthttp-routing - 用于fasthttp服务器的快速强大的路由包。
  • http2 - fasthttp的HTTP/2实现。
  • router - 一个高性能的fasthttp请求路由器,可以很好地扩展。
  • fastws - 为fasthttp设计的轻量级WebSocket包,用于并发处理读/写操作。
  • gramework - 由fasthttp维护者之一制作的Web框架。
  • lu - 一个基于fasthttp的高性能Go中间件Web框架。
  • websocket - 基于Gorilla的fasthttp WebSocket实现。
  • websocket - 基于事件的高性能WebSocket库,用于零分配的WebSocket服务器和客户端。
  • fasthttpsession - 用于fasthttp服务器的快速强大的会话包。
  • atreugo - 高性能且可扩展的微型Web框架,在热路径上实现零内存分配。
  • kratgo - 简单、轻量级和超快速的HTTP缓存,用于加速你的网站。
  • kit-plugins - fasthttp的go-kit传输实现。
  • Fiber - 受Expressjs启发的运行在Fasthttp上的Web框架。
  • Gearbox - :gear: gearbox是一个用Go编写的Web框架,专注于高性能和内存优化。
  • http2curl - 一个将fasthttp请求转换为curl命令行的工具。

常见问题

  • 为什么要创建另一个http包而不是优化net/http?

    因为net/http API限制了许多优化机会。 例如:

    • net/http Request对象的生命周期不限于请求处理器执行时间。所以服务器必须为每个请求创建一个新的请求对象,而不能像fasthttp那样重用现有对象。
    • net/http头部存储在map[string][]string中。所以服务器必须解析所有头部,将它们从[]byte转换为string并放入map中,然后才能调用用户提供的请求处理器。这些都需要不必要的内存分配,而fasthttp避免了这些。
    • net/http客户端API要求为每个请求创建一个新的响应对象。
  • 为什么fasthttp API与net/http不兼容?

    因为net/http API限制了许多优化机会。更多细节请参见上面的回答。此外,某些net/http API部分在使用上并不理想:

  • 为什么fasthttp不支持HTTP/2.0和WebSockets?

    HTTP/2.0支持正在进行中。WebSockets已经完成。 第三方也可以使用RequestCtx.Hijack来实现这些功能。

  • 与fasthttp相比,net/http有哪些已知的优势? 是的:

  • net/http 从 go1.6 开始支持 HTTP/2.0。

  • net/http 的 API 稳定,而 fasthttp 的 API 不断演进。

  • net/http 能处理更多 HTTP 边缘情况。

  • net/http 可以同时流式处理请求和响应体。

  • net/http 可以处理更大的消息体,因为它不会将整个消息体读入内存。

  • net/http 应该包含更少的 bug,因为它被更广泛的用户使用和测试。

  • fasthttp API 为什么倾向于返回 []byte 而不是 string

    因为 []byte 转换为 string 并非免费操作 - 它需要内存分配和复制。如果你更喜欢使用字符串而不是字节切片,可以随意将返回的 []byte 结果包装在 string() 中。但请注意,这会带来一定的开销。

  • fasthttp 支持哪些 GO 版本?

    Go 1.18.x。不会支持更早的版本。

  • 请提供真实的基准测试数据和服务器信息

    请参阅这个 issue

  • 是否计划为 fasthttp 添加请求路由功能?

    没有计划在 fasthttp 中添加请求路由功能。 可以使用支持 fasthttp 的第三方路由器和 Web 框架:

    更多信息请参阅这个 issue

  • 我在 fasthttp 中发现了数据竞争!

    很好!提交一个 bug。但在此之前,请检查你的代码中以下几点:

  • 我在这里没有找到我问题的答案

    尝试浏览这些问题

编辑推荐精选

扣子-AI办公

扣子-AI办公

职场AI,就用扣子

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

堆友

堆友

多风格AI绘画神器

堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。

图像生成AI工具AI反应堆AI工具箱AI绘画GOAI艺术字堆友相机AI图像热门
码上飞

码上飞

零代码AI应用开发平台

零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

下拉加载更多